欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 【LeetCode力扣热题100】【LeetCode 128】最长连续序列

【LeetCode力扣热题100】【LeetCode 128】最长连续序列

2025/5/6 15:22:34 来源:https://blog.csdn.net/u011700865/article/details/144408242  浏览:    关键词:【LeetCode力扣热题100】【LeetCode 128】最长连续序列

方法一:排序-遍历

将原数组排序,然后遍历,跳过连续相同的元素,计算相邻元素的差值,等于1则计数加一,否则重新计数。

class Solution {
public:int longestConsecutive(vector<int>& nums) {if(nums.size()==0) return 0;if(nums.size()==1) return 1;sort(nums.begin(), nums.end());int count = 0;int res = 0;for(int i = 1; i<nums.size(); i++){if(nums[i]==nums[i-1]) continue;if(1 == (nums[i] - nums[i-1])) count++;else{res = max(res, count);count = 0;}}res = max(res, count);return res+1;}
};

方法二:哈希(官方)

利用unordered_set容器,将原数组存入并去重。遍历unordered_set,判断当前元素num是否为符合条件的子序列的第一个元素,即num-1是否在unordered_set序列中,不在则该元素不是子序列中的首位元素,跳过;若在序列中,则进入下一层循环,num循环加一,判断num+1是否在unordered_set序列中,若在,则num+1也在符合条件的子序列中,直到num+1不在unordered_set序列中,则子序列结束,在累加判断num+1的时候同时计数,在子序列结束的时候判断长度,取最长。

class Solution {
public:int longestConsecutive(vector<int>& nums) {if(nums.size()==0) return 0;if(nums.size()==1) return 1;int res = 0;unordered_set<int> numset;for(const auto& num : nums) numset.insert(num);for(const auto& num : nums){if(!numset.count(num-1)){int currentnum = num;int count = 1;while(numset.count(currentnum+1)){currentnum++;count++;}res = max(res, count);}}return res;}
};

注:

方法二避免了排序操作,但需要去重。

按照结果来看方法二的效率没有方法一更优。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词