day3 leetcode-hot100-3

128. 最长连续序列 - 力扣(LeetCode)

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值