题目
方法一 哈希表
因为nums中会存在相同数字,所以第一步要去重,去重可以用unordered_set
然后就是不断匹配x后面是否存在x+1 x+2 ... x+y那么最长递增序列就是y+1
用暴力枚举的方法就是O(n)遍历数组是否存在这个数
更高效的是用哈希表存储数组中的数,查看这个数是否存在,这样能优化到O(1)
在最坏情况下时间复杂度会达到O(n^2)即外层枚举O(n)次内层暴力匹配O(n)次,无法满足题目要求
但仔细分析这个过程,有许多不必要的枚举已知有一个x,x+1,x+2,...,x+y的连续序列,而我们却从x+1 x+2...开始匹配,这样就浪费了很多时间,所以我们要跳过这些情况
判断条件是:我们要枚举的数x一定不存在前驱数x-1,不然我们就会从x-1开始尝试匹配了
最终代码:
class Solution {
public:
int longestConsecutive(vector<int>& nums) {
unordered_set<int> num;
//去重
for(int& n : nums){
num.insert(n);
}
int longestStreak = 0;
//枚举
for(const int& n : num){
if(!num.count(n-1)){
int currentnum = n;
int currentStreak = 1;
while(num.count(currentnum + 1)){
currentnum += 1;
currentStreak += 1;
}
longestStreak = max(longestStreak, currentStreak);
}
}
return longestStreak;
}
};
JAVA版代码
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> num_set = new HashSet<Integer>();
for(int num : nums){
num_set.add(num);
}
int longestStreak = 0;
for(int num : num_set){
if(!num_set.contains(num - 1)){
int currentNum = num;
int currentStreak = 1;
while(num_set.contains(currentNum + 1)){
currentNum += 1;
currentStreak += 1;
}
longestStreak = Math.max(longestStreak,currentStreak);
}
}
return longestStreak;
}
}