zoukankan      html  css  js  c++  java
  • LeetCode 128. 最长连续序列(Longest Consecutive Sequence)

    题目描述

    给定一个未排序的整数数组,找出最长连续序列的长度。

    要求算法的时间复杂度为 O(n)

    示例:

    输入: [100, 4, 200, 1, 3, 2]
    输出: 4
    解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。

    解题思路

    利用并查集的思想,构造一个map记录数组中以每个数所在的最长连续序列长度。每次遍历到一个数时,首先检查map中是否存在该数,若存在直接跳过,否则作如下更新操作:

    找到左右相邻数字是否在map中,若存在则分别记录他们所在的最长连续序列长度,并更新当前的最长连续序列长度,然后把长度更新到新序列左右端点和此数对应的map中。

    代码

     1 class Solution {
     2 public:
     3     int longestConsecutive(vector<int>& nums) {
     4         map<int, int> m;
     5         int maxLen = 0;
     6         for(int num: nums){
     7             if(m.count(num)) continue;
     8             int left = m.count(num - 1) ? m[num - 1] : 0;
     9             int right = m.count(num + 1) ? m[num + 1] : 0;
    10             int len = left + right + 1;
    11             maxLen = max(maxLen, len);
    12             m[num - left] = len;
    13             m[num + right] = len;
    14             m[num] = len;
    15         }
    16         return maxLen;
    17     }
    18 };
  • 相关阅读:
    [学习笔记]康托展开
    [模板]平衡树
    [题解]涂色
    [学习笔记]Lucas定理
    欧拉定理及其证明
    一些杂题(排列组合
    swift 动画合集
    UIDynamicAnimator UIKit动力学
    swift 当协议遇见了泛型
    Swift 协议
  • 原文地址:https://www.cnblogs.com/wmx24/p/9725199.html
Copyright © 2011-2022 走看看