哈希#中等#最长连续序列
哈希#中等#最长连续序列
前文
给定一个未排序的整数数组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 进行授权