leecodde-0128 最长连续序列

在这里插入图片描述

题目中需要注意的点

  1. 数组中可能存在重复元素
  2. 数组中可能为空

灵神的思路

灵神太强了,这个题不能够直接遍历数组,遍历数组就会出现,如果数组是[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;
    }
}

自己的思路

  1. 这个题比较简单,我提交了两个版本就完成了这个题目

  2. 由于题目要求时间复杂度为O(n),碰到这种时间复杂度,同时又是查找算法,我们就要想到利用这个哈希表进行查找。时间效率最高

  3. 我们首先先利用for循环将这个nums数组添加到这个集合当中

  4. 之后我们遍历这个nums数组,统计好计数器count,遍历器j,以及返回结果max

    1. 为了能够更加节省时间,我们需要对重复遍历的情况进行排除,我采取的办法是每次查找的时候把当前的元素在集合中删除
    2.  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;
      
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值