方法一:排序-遍历
将原数组排序,然后遍历,跳过连续相同的元素,计算相邻元素的差值,等于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;}
};
注:
方法二避免了排序操作,但需要去重。
按照结果来看方法二的效率没有方法一更优。