-
2.23
- 想起来优化了,但是忘了 count 初始值为 1,包含起点本身
-
2.5
- 忘记优化了,
- set 的 add天然会判断是否存在
- for 循环在 set 中 for
- 判断当前位置如果不是开头位置,则直接剪枝(通过 看num-1 存不存在)
- 忘记优化了,
-
1.22
- 放入 set 后,后续在 set 里遍历,且必须剪枝(判断这个数是不是起始位置)否则时间超时
class Solution {
public int longestConsecutive(int[] nums) {
int max = 0;
Set<Integer> set = new HashSet<>();
for(int num:nums){
set.add(num);
}
// for(int i=0;i<nums.length;i++){
// if(!set.contains(nums[i]-1)){
// int maxTemp =1;
// int ptr = i;
// int current = nums[ptr];
// while(set.contains(current+1)){
// maxTemp++;
// current++;
// }
// max = Math.max(max,maxTemp);
// }
// }上面的完全超时
for(int num:set){
int current = num;
int maxTemp = 1;
if(!set.contains(num-1)){
while(set.contains(current+1)){
maxTemp++;
current++;
}
max = Math.max(max,maxTemp);
}
}
return max;
}
}- 1.5
- 用 set 来存数组每种数字后
- 判断当前数字有没有前面的数字来判断是否为起点 - 是起点就开始 while 遍历(结束条件是没有下一个,用 contains 实现)贪心记录最大值
第二版
class Solution {
public int longestConsecutive(int[] nums) {
int longest = 0;
Set<Integer> set = new HashSet<>();
for(int num:nums){
set.add(num);
}
for(int num:set){
if(!set.contains(num-1)){
int length=1;
int currentNum = num;
while(set.contains(currentNum+1)){
length++;
currentNum++;
}
longest = Math.max(length,longest);
}
}
return longest;
}
}- 把每个数放进hashset中(注意指定Integer数据类型)
- 遍历集合,找出是起点的数字(num-1不在set),尝试往后找,遍历数字
class Solution {
public int longestConsecutive(int[] nums) {
Set<Integer> set = new HashSet<>();
for(int i=0;i<nums.length;i++){
set.add(nums[i]);
}
int longest = 0;
for(int num:set){
if(!set.contains(num-1)){
int currentNum = num;
int length = 1;
while(set.contains(currentNum+1)){
currentNum++;
length++;
}
longest = Math.max(longest,length);
}
}
return longest;
}
}