【128. 最长连续序列】-2023.10.31

思路:

  1. 创建一个hash列表,nums_set;
  2. 通过外层循环依次遍历nums_set,找出连续序列中最小的那个数才开始内层循环,避免重复计算连续序列的长度,如7、8、9,8、9,z找到7之后再计算连续序列长度;
  3. 用math.max()函数更新最长序列长度。

例子:

如列表[10,9,15,8,7,20,6]:
当遍历到10时,有比10小1的数9,所以跳过运算,直接遍历下一个数字9,
在nums_set中又存在比9小1的8,又跳过后面的运算,遍历下一个数15,nums_set并不存在14,所以currentStreak=1,但不存在16,
所以用longestStreak=max(currentStreak,longestStreak)暂时得到“最长的序列值”。然后将外层循环num遍历到8,nums_set中存在7,所以跳过(也就是不将currentStreak赋值)
遍历到7,nums_set中又存在6,继续跳过,外层循环num遍历到20,nums_set中没有19,所以currentStreak=1,但不存在21,所以继续用longestStreak=max(currentStreak,longestStreak) 暂时得到“最长的序列值,最后外层循环num遍历到6,nums_set中存在7,8,9,10,所以通过内层循环四次currentStreak +=1,最后得currentStreak=5,用max函数与上一个longestStreak比较,得到新的
longestStreak = 5

代码:

class Solution {
    public int longestConsecutive(int[] nums) {
       Set<Integer> nums_set = new HashSet<Integer>();  //创建一个hash列表,nums_set

       // 去除重复的元素
       for(int num : nums){
           nums_set.add(num);
       }

        int longestStreak = 0; // 初始化最长连续序列的长度值为0

        //遍历nums_set进行逐个比较
        for(int num : nums_set){
        
            longestStreak = 0;
            if(!nums_set.contains(num-1)){
                int currentNum = num; //可以不用创建新变量currentNum,直接使用num
                int currentStreak = 1;

                while(nums_set.contains(currentNum+1)){ //currentNum可以换成num
                    currentNum +=1; //currentNum可以换成num
                    currentStreak +=1; 
                }

                // 更新最长连续序列的长度
                longestStreak = Math.max(currentStreak,longestStreak);

            }

        }

        return longestStreak;

    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值