LeetCode - 128. 最长连续序列
题目
128. 最长连续序列 - 力扣(LeetCode)
思路
这题要求O(n)时间复杂度,所以不能用排序的方法。我的思路是使用哈希表来实现常数时间的查找。
具体做法是:首先将所有元素放入哈希集合中,然后对每个元素,我们尝试寻找以它为起点的连续序列。为了避免重复计算,我们只从'序列的起点'开始计算 - 也就是当一个数字x在集合中,但x-1不在集合中时,才开始寻找连续序列。
这样的话,对于每个元素,我们最多只会执行一次'寻找序列'的操作,保证了总体O(n)的时间复杂度。
读者可能出现的错误写法
class Solution {
public:int longestConsecutive(vector<int>& nums) {if(nums.empty()){return 0;}unordered_set<int> set(nums.begin(),nums.end());int longest = 0;for(auto num : nums){if(!set.count(num-1)){int current = num;int curlength = 1;while(set.count(current+1)){current++;curlength++;}longest = max(longest,curlength);}}return longest;}
};
for(auto num : nums)这个情况可能会造成超时的问题,因为nums可能带有重复的元素,所以要把nums换成set
正确写法
class Solution {
public:int longestConsecutive(vector<int>& nums) {if(nums.empty()){return 0;}unordered_set<int> set(nums.begin(),nums.end());int longest = 0;for(auto num : set){if(!set.count(num-1)){int current = num;int curlength = 1;while(set.count(current+1)){current++;curlength++;}longest = max(longest,curlength);}}return longest;}
};