- 128. Longest Consecutive Sequenc
- 128. Longest Consecutive Sequenc
- 128. Longest Consecutive Sequenc
- 128. Longest Consecutive Sequenc
- 128. Longest Consecutive Sequenc
- 128. Longest Consecutive Sequenc
- 128. Longest Consecutive Sequenc
- 128. Longest Consecutive Sequenc
- 每天(?)一道Leetcode(17) Longest Cons
- Longest Consecutive Sequence
题目描述:给一个未排序的整数数组,查找其中最长连续元素序列的长度。如[100, 4, 200, 1, 3, 2]找到[1, 2, 3, 4],返回4。要求复杂度为O(n)。
分析:由于限定了线性复杂度所以不能用排序了。第一个想法是设一个长度为给定的数组中最大数mx的标记数组,记录给定数组中从0~mx 的元素是否出现,然后遍历一遍标记数组,找连续1的最长长度。提交发现数据存在负数,思考不全面。还是用map来记录。
代码:虽然是两重循环,但实际上最多只会遍历数组一次。因为对一个数左右的查找是连续的,而子序列是有断点的。故复杂度为O(n)。
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
//无序容器,快速查找删除,不担心略高的内存时用unordered_map;有序容器稳定查找删除效率,内存很在意时候用map。
unordered_map<int, bool> used;
//遍历nums,i是其中元素,类似Python 中for i in nums 的用法
for (auto i : nums)
used[i] = false;
int longest = 0;
for (auto i : nums)
{
if (used[i]) continue; //已经遍历过
int len = 1;
for (int j = i + 1; used.find(j) != used.end(); j++) //查找比 i 大的部分
{
used[j] = true;
len ++;
}
for (int j = i - 1; used.find(j) != used.end(); j--)
{
used[j] = true;
len ++;
}
longest = max(longest, len);
}
return longest;
}
};
网友评论