暴力解决:将<nums[i],i>存如hashmap中,再从min_num到max_num中寻找hashmap中存在的连续数
java
class Solution {
public int longestConsecutive(int[] nums) {
// 遍历数组,将<nums[i],i>存如hashmap中
Map<Integer, Integer> map = new HashMap<>();
int min_num = 0;
int max_num = 0;
if (nums.length>0){
min_num = nums[0];
max_num = nums[0];
}
for(int i = 0;i<nums.length;i++){
map.put(nums[i], i);
if (nums[i] < min_num) {
min_num = nums[i];
}
if (nums[i] > max_num) {
max_num = nums[i];
}
}
int max_k = 0; // 记录目前的最大连续序列
int k = 0; // 记录当前的连续序列数
for(int i = min_num;i<=max_num;i++){
if (map.containsKey(i)) {
k++;
if (k > max_k) {
max_k = k;
}
} else {
k = 0;
}
}
return max_k;
}
}
注意:
- 可能会输入空数组,避免
int min_num = num[0]
的直接使用!!!
错误原因:超出时间限制

Set解决方法:在set中找到所有连续序列的最小数,然后向右依次添加连续的个数,取最大值
java
class Solution {
public int longestConsecutive(int[] nums) {
// 将nums存放如set中
Set<Integer> set = new HashSet<>();
for(int num:nums){
set.add(num);
}
// 遍历set计算长度
int max_k = 0;
for(int num:set){
int k = 1;
if(!set.contains(num-1)){ //左边没数,某一连续链最小数
while(set.contains(num+1)){ // 右边有数
k++;
num++;
}
}
max_k = max_k>k ? max_k : k;
}
return max_k;
}}
Map解决方法
