1.暴力的我又来了(嘻嘻😊)
众所周知,我是暴力王,从不关注时间复杂度,所以看到这个题的第一眼,直接排序,选择最长的不就可以了。
(1)先用HashSet去重,然后进行排序(day2学的排序函数用到了)。
(2)新的数组要找到最长的序列,大概率是一层for,然后嵌套一个for,判断每个数字开头最长的序列数,最后取最大值。(即使优化一下,这一步也不能达到O(n),比如已经在序列中的就跳过不判断了。)
(new 2)利用day1与day2的知识,用HashMap进行查找,一层for循环就可以,简单来说key-value的含义是key作为结尾的序列长度为value。这样如果key1找到下一个符合的key2,就让其key2的value2=value1+1;最后遍历map找到最大值。
deepseek老师教给的知识:
(1)HashSet创建:HashSet<Integer> set = new HashSet<>();
(2)HashSet去重:注意就是成员方法:add(),size();
(3)entry遍历HashMap:
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
entry.getValue()
}
class Solution {
public int longestConsecutive(int[] nums) {
if(nums.length==0){
return 0;
}
HashSet<Integer> set = new HashSet<>();
for(int num:nums){
set.add(num);
}
int[] res = new int[set.size()];
int i=0;
for(int num:set){
res[i++]=num;
}
int ans=1;
HashMap<Integer,Integer> map =new HashMap<>();
for(i=0;i<res.length;i++){
map.put(res[i],1);
}
Arrays.sort(res);
for(i=0;i<res.length-1;i++){
if(map.containsKey(res[i]+1)){
int value =map.get(res[i]);
map.put(res[i+1],value+1);
}
}
for(Map.Entry<Integer,Integer> entry : map.entrySet()){
if(entry.getValue()>ans){
ans=entry.getValue();
}
}
return ans;
}
}
2.寻开头方法
简单来说就是判断这个数是不是某个序列的开头,如果是就进行计算,找到该序列的长度,如果不是,那就跳过。
关键就是判断数num是否为开头,方法很简单,就是查看HashSet中是否存在num-1,如果存在就不是,如果不存在就是开头。
(1)先HashSet去重。
(2)然后判断num是否为开头。
(3)如果是,用while计算num开头的序列长度:还是用contains方法判断是否存在num+1,如果存在就+1,每次循环结束就和最长的比较一下。
deepseek老师教给的知识:
(1)增强for遍历HashSet
(2)HashSet判断是否存在方法:set.contains(value);
(3)最大值Math.max (ㄒoㄒ)~~
class Solution {
public int longestConsecutive(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for(int num:nums){
set.add(num);
}
int longeststack=0;
for(int num : set){
if(!set.contains(num-1)){
int currentstack=1;
int currentnum=num;
while(set.contains(currentnum+1)){
currentstack+=1;
currentnum+=1;
}
longeststack = Math.max(longeststack,currentstack);
}
}
return longeststack;
}
}