
题目中需要注意的点
- 数组中可能存在重复元素
- 数组中可能为空
灵神的思路
灵神太强了,这个题不能够直接遍历数组,遍历数组就会出现,如果数组是[1,1,1,1,1,1],那么每一个1都会区集合中去查找,那么时间复杂度是O(n2),我是通过这个移除来避免的,
同时对于我的解法中的,分为两头计算长度,灵神的思路无疑更加巧妙,它是去寻找这个序列的起点,判断在合格序列是否存在比当前元素更小的数。,太强了
class Solution {
public int longestConsecutive(int[] nums) {
int ans = 0;
Set<Integer> st = new HashSet<>();
for (int num : nums) {
st.add(num); // 把 nums 转成哈希集合
}
for (int x : st) { // 遍历哈希集合
if (st.contains(x - 1)) {
continue;
}
// x 是序列的起点
int y = x + 1;
while (st.contains(y)) { // 不断查找下一个数是否在哈希集合中
y++;
}
// 循环结束后,y-1 是最后一个在哈希集合中的数
ans = Math.max(ans, y - x); // 从 x 到 y-1 一共 y-x 个数
}
return ans;
}
}
自己的思路
-
这个题比较简单,我提交了两个版本就完成了这个题目
-
由于题目要求时间复杂度为O(n),碰到这种时间复杂度,同时又是查找算法,我们就要想到利用这个哈希表进行查找。时间效率最高
-
我们首先先利用for循环将这个nums数组添加到这个集合当中
-
之后我们遍历这个nums数组,统计好计数器count,遍历器j,以及返回结果max
- 为了能够更加节省时间,我们需要对重复遍历的情况进行排除,我采取的办法是每次查找的时候把当前的元素在集合中删除
-
HashSet<Integer> set = new HashSet<>(); for(int num:nums){ set.add(num); } int max = 0; for(int i=0;i<nums.length;i++){ int count=1; set.remove(nums[i]); int j = 1; while(true){ if(set.contains(nums[i]+j)){ count++; set.remove(nums[i]+j); j++; }else{ j=1; break; } } while(true){ if(set.contains(nums[i]-j)){ count++; set.remove(nums[i]-j); j++; }else { break; } } if(count>max){ max=count; } } return max;

被折叠的 条评论
为什么被折叠?



