LeetCode题解(Week 13):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.

中文大意:

给定一个无序的整形数组,找到数组中的最长连续序列。例如给定[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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值