题目描述:来自LeetCode
思路:可能第一想法是排序,反正我是,但是排序,快排的时间复杂度是O(NlongN)的,题目要求用O(N)时间复杂度,所以只能是遍历一边数组求解。遍历数组的时候,如果连续序列是从这个数开始的,说明说明呢?说明这个数的前一个数不存在!那么我们就要把这个数当做这个序列的第一个数,看这个数+1是否存在,+2是否存在...不存在了我们就更新最大值。那连续序列不是以这个数开始的条件是什么呢?那这个数-1的数一定存在,这样连续最长序列一定是从这个数-1的数开始的,所以这样就不用求这个数开始的连续序列,我们直接遍历下一个数就行。问题是怎么判断这个数-1或者+1的数是否存在呢?哈希表!因为哈希表不仅可以用来判断是否存在还可以去重!连续序列一定不包含重复元素,在开始的时候,我们就把每一个数都放进hash集合就行了。
代码实现C++:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
if(nums.size()<=1) return nums.size();
unordered_set<int> set;
for(int num:nums){//将元素存入hash表
set.insert(num);
}
int longestCon=0;//用来更新每一次求的序列长度的最大值
for(int num:nums){
if(!set.count(num-1)){//如果这个数-1的数不存在,那就说明这个数就是某个序列的起始
int currentNum=num;
int currentLength=1;//用来更新当前序列的最大长度
while(set.count(currentNum+1)){
currentNum+=1;//当下一个连续的数存在,我们就更该当前要求的数
currentLength+=1;//更新长度
}
longestCon=max(longestCon,currentLength);//更新每一次求的序列的最大值
}
}
return longestCon;
}
};
今日刷题任务完成,如有错误,欢迎指正~