LeetCode: 128. Longest Consecutive Sequence

279人阅读 评论(0) 收藏 举报
分类:

LeetCode: 128. Longest Consecutive Sequence

题目描述

Given an unsorted array of integers, find the length of the longest consecutive elements sequence.

For example,
Given [100, 4, 200, 1, 3, 2],
The longest consecutive elements sequence is [1, 2, 3, 4]. Return its length: 4.

Your algorithm should run in O(n) complexity.

题目大意: 给定未排序的整数数组,找到其连续被元素的最长序列。

解题思路 —— 并查集

利用并查集,将相邻元素合并为一个集合,求得最大集合的元素个数即可。
如下图描述了题目例子中的元素形成的集合,由图可知,最大集合为 {1,2,3,4}, 其大小为 4.

并查集

AC 代码

class Solution 
{
    // 求出 curNum 和 curNum+1 的 consecutiveNum (O(1))
    void Union(vector<int>& consecutiveNum, int curNum, unordered_map<int, int>& num2Idx)
    {
        int curNumIdx = num2Idx[curNum];

        if(num2Idx.find(curNum-1) != num2Idx.end() && consecutiveNum[num2Idx[curNum-1]] != -1)
        {
            consecutiveNum[curNumIdx] = num2Idx[curNum - 1];
        }
        else 
        {
            consecutiveNum[curNumIdx] = curNumIdx;
        }

        if(num2Idx.find(curNum+1) != num2Idx.end() && consecutiveNum[num2Idx[curNum+1]] != -1)
        {
            consecutiveNum[num2Idx[curNum+1]] = consecutiveNum[curNumIdx];
        }
    }

    // 收缩关系集(O(n))
    int findMinConsecutiveNum(vector<int>& consecutiveNum, int curNumIdx)
    {
        if(consecutiveNum[curNumIdx] == curNumIdx || consecutiveNum[curNumIdx] == -1) return curNumIdx;
        consecutiveNum[curNumIdx] = findMinConsecutiveNum(consecutiveNum, consecutiveNum[curNumIdx]);

        return consecutiveNum[curNumIdx];
    }
public:
    int longestConsecutive(vector<int>& nums)
    {
        // consecutiveNum[i] 表示与 i 形成的最长连续序列的最小值的索引
        vector<int> consecutiveNum(nums.size(), -1);
        // 记录 num 到其 index 的映射(unordered_map 是散列表,存取复杂度为 O(1))
        // 重复元素只处理一个
        unordered_map<int, int> num2Idx;

        //  初始化 num2Idx... (O(n))
        for(size_t idx = 0; idx < nums.size(); ++idx)
        {
            num2Idx[nums[idx]] = idx;
        }

        // 计算 consecutiveNum (O(n))
        for(int curNum : nums)
        {
            Union(consecutiveNum, curNum, num2Idx);
        }

        // 收缩关系 (O(n))
        for(size_t i = 0; i < consecutiveNum.size(); ++i)
        {
            findMinConsecutiveNum(consecutiveNum, i);
        }

        // 计算连续序列((O(n)))
        vector<int> counts(consecutiveNum.size(), 0);
        for(size_t i = 0; i < consecutiveNum.size(); ++i)
        {
            if(consecutiveNum[i] == -1) continue;
            ++counts[consecutiveNum[i]];
        }

        // 统计最大连续序列的长度((O(n)))
        int maxLong = 0;
        for(int x : counts)
        {
            maxLong = max(x, maxLong);
        }

        return maxLong;
    }
};
查看评论

[LeetCode]128.Longest Consecutive Sequence

Longest Consecutive Sequence Given an unsorted array of integers, find the length of the longes...
  • SunnyYoona
  • SunnyYoona
  • 2014年01月17日 22:16
  • 1951

LeetCode 128. Longest Consecutive Sequence

题目描述: Given an unsorted array of integers, find the length of the longest consecutive elements seq...
  • zhyh1435589631
  • zhyh1435589631
  • 2016年03月24日 23:28
  • 554

leetcode刷题系列C++-Longest Consecutive Sequence

Given an unsorted array of integers, find the length of the longest consecutive elements sequence. ...
  • u013676711
  • u013676711
  • 2016年02月17日 14:12
  • 436

【LeetCode with Python】 Longest Consecutive Sequence

Given an unsorted array of integers, find the length of the longest consecutive elements sequence. ...
  • nerv3x3
  • nerv3x3
  • 2014年07月06日 15:09
  • 2989

[leetcode] 128. Longest Consecutive Sequence 解题报告

题目链接:https://leetcode.com/problems/longest-consecutive-sequence/ Given an unsorted array of intege...
  • qq508618087
  • qq508618087
  • 2016年02月25日 02:13
  • 1815

LeetCode - 128. Longest Consecutive Sequence - 思路详解- C++

假设有一个未排序整数数组,找出数组中最长的连续序列。 比如:数组【100,4,200,1,3,2】 最长的连续序列为【1,2,3,4】。则返回其长度为4...
  • SJWL2012
  • SJWL2012
  • 2017年01月16日 22:23
  • 140

[python]leetcode(128). Longest Consecutive Sequence

problem Given an unsorted array of integers, find the length of the longest consecutive element...
  • PKU_Jade
  • PKU_Jade
  • 2017年09月10日 21:53
  • 125

Leetcode-549. Binary Tree Longest Consecutive Sequence II

前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发CSDN...
  • mcf171
  • mcf171
  • 2017年04月09日 11:23
  • 871

leetcode 298: Binary Tree Longest Consecutive Sequence

Binary Tree Longest Consecutive Sequence Total Accepted: 437 Total Submissions: 1351 Di...
  • xudli
  • xudli
  • 2015年10月29日 16:35
  • 4942

Longest Consecutive Sequence -- LeetCode

原题链接: http://oj.leetcode.com/problems/longest-consecutive-sequence/  这道题是要求出最长的整数连续串。我们先说说简单直接的思路,就...
  • linhuanmars
  • linhuanmars
  • 2014年04月05日 00:11
  • 9484
    个人资料
    持之以恒
    等级:
    访问量: 35万+
    积分: 2940
    排名: 1万+
    友情链接
    最新评论