输入:一个未排序整数数组 nums
要求:找到数字的 最长连续序列 的长度。不要求序列在原数组中连续。
输出:最长连续序列的长度
思路:
用哈希表 unordered_map<int,int> 来记录:
- 某个数字是否“还没被处理”
- 同时用
tmp[n]存该数字所在连续段的长度
从每个数字开始,向左、向右扩散查找,把能扩下去的全部取完,并把访问过的数字标记为 0,避免重复计算。
复杂度:
时间复杂度:O(n) 每个数字最多被访问一次
空间复杂度:O(n) 哈希表存储所有数字
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_map<int, int> tmp;
int ans = 0;
for (int n:nums) {
tmp[n] = 1;
}
for (int n:nums) {
if (tmp[n] == 0) {
continue;
}
int t1 = n;
int t2 = n;
while (tmp.find(t1 + 1) != tmp.end() ) {
tmp[n]++;
tmp[t1+1] = 0;
t1++;
}
while (tmp.find(t2 - 1) != tmp.end()) {
tmp[n]++;
tmp[t2-1] = 0;
t2--;
}
ans = max(ans, tmp[n]);
tmp[n] = 0;
}
return ans;
}
};
2325

被折叠的 条评论
为什么被折叠?



