LeetCode题解(Week 13):128. Longest Consecutive Sequence

来源:互联网 发布:ubuntu怎么注销用户 编辑:程序博客网 时间:2024/06/03 17:33

原题目:

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.

中文大意:

给定一个无序的整形数组,找到数组中的最长连续序列。例如给定[100,4,200,1,3,2]那么最长的连续序列是[1,2,3,4],这时候返回4。

题解1:

class Solution {public:    int longestConsecutive(vector<int>& nums) {        if(nums.size()==0)            return 0;        set<int> s;        for(int i = 0 ; i < nums.size();i++)            s.insert(nums[i]);        // 将所有的元素都压到集合中,形成有序集        set<int>::iterator it = s.begin();        int prevnum = *it;        it++;        int currnum  = *it;        // 检查连续性        int curr = 1;        int maxlen = 1;        for (; it!=s.end(); ++it)        {            currnum = *it;            if(currnum==prevnum+1)                curr++;            else             {                maxlen = maxlen < curr ? curr : maxlen;                curr = 1;            }            prevnum = currnum;            cout<<*it<<endl;            // if(it)        }        maxlen = maxlen < curr ? curr : maxlen;        // cout << maxlen <<endl;        return maxlen;    }};

题解1思路:

  • 首先将数组中的所有元素放到一个set中,形成了一个有序集合
  • 然后遍历这个有序集合,从第二个元素开始,并初始化一个maxlen用来保存结果
  • 遍历到的当前元素如果不等于上一个元素加1,证明连续性已经被打破,maxlen = max(maxlen,currlen),currlen表示当前字符结尾的连续序列的长度
  • 遍历完所有元素后,再执行一次maxlen = max(maxlen,currlen),因为如果在整个序列都是连续的,没有被中断的情况下,maxlen = max(maxlen,currlen)是不会被执行的。
    • 如[0,1,2,3,4]当执行到4的时候,currlen = 5,但是maxlen = 1(初始化长度),但如果最后不执行maxlen = max(maxlen,currlen),maxlen的值是不会变的
  • 这样做的时间复杂度其实严格上来讲为O(nlogn)因为在插入到set中需要额外的时间

题解2:

class Solution {public:    int longestConsecutive(vector<int>& nums) {        set<int> s(nums.begin(),nums.end());        int ans = 0, last = *s.begin()-1, len = 0;        for(auto i:s)        {            if (i-last == 1) ans = max(ans,++len);            else len = 1;            last = i;        }        return ans;    }};

题解2思路:

  • 与题解1类似,一开始将数组中的所有元素都放到set中
  • 遍历set中的元素,这里有一个比较巧妙的做法:将上一个数last的值设为“第一个元素的值 - 1”
  • 如果当前元素比last的值大1,则更新maxlen的值
  • 如果上一点不成立,则将当前的长度len设为1
原创粉丝点击