文章

哈希#中等#最长连续序列

哈希#中等#最长连续序列

前文

给定一个未排序的整数数组nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为O(n)的算法解决此问题。

1
2
3
4
5
6
7
8
9
10
示例 1:

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

示例 2:

输入:nums = [0,3,7,2,5,8,4,6,0,1]
输出:9

正文

1
2
3
4
5
6
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {

    }
};

解法1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if (nums.size() == 0)
            return 0;
        set<int> mySet(nums.begin(), nums.end());
        if (mySet.size() == 2) {
            if (*mySet.begin() - *(--mySet.end()) == -1 || *mySet.begin() - *(--mySet.end()) == 1) {
                return 2;
            } else {
                return 1;
            }
        }
        int max = 1, len = 1;
        int rbegin = *mySet.rbegin();
        for (auto it = mySet.rbegin(); it != mySet.rend(); ++it) {
            cout << rbegin << " " << *it << " " << endl;
            if (*it == rbegin - 1) {
                len += 1;
            } else {
                len = 1;
            }
            if (len > max)
                max = len;
            rbegin = *it;
        }

        return max;
    }
};

先将数组转成不可重复集合,set会自动排序,然后匹配当前元素和下个元素是否相差1, 如果递减,则长度+1,并且比较和max的大小,保留大的长度。 注意这段代码没有对长度2的不重复集合做判断,所以前面需要对长度2的集合手动判断。

解法2 优化解法1代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
    int longestConsecutive(vector<int>& nums) {
        if (nums.size() == 0)
            return 0;
        set<int> mySet(nums.begin(), nums.end());
        int max = 1, len = 1;
        int rbegin = *mySet.rbegin();
        for (auto it = mySet.rbegin(); it != mySet.rend(); ++it) {
            cout << rbegin << " " << *it << " " << endl;
            if (*it == rbegin - 1) {
                len += 1;
            } else {
                len = 1;
            }
            if (len > max)
                max = len;
            rbegin = *it;
        }

        return max;
    }
};

不需要对长度2的集合做特殊判断,从尾部开始比较即可。

本文由作者按照 CC BY 4.0 进行授权

热门标签