定个小目标之刷LeetCode热题(22)

这道题最容易想的就是排序后再遍历,但是时间复杂度就不是O(n)了,所以还是得用更优的解法,直接看题解,它是使用了HashSet,遍历数组,对于每一个数x,如果不存在x - 1则进入内循环,否则跳过,内循环里就是依次查看x+1、x+2、x+3、......是否存在,并维护一个变量currentStreak来记录连续数字的长度,维护一个longestStreak变量来记录出现最长的连续数字的长度,文字描述了一遍,试着以这种思路编码,代码如下

class Solution {
    public int longestConsecutive(int[] nums) {
        Set<Integer> hashSet = new HashSet<>();
        // 把数组元素存到Set集合中,便于查找
        for (int num : nums) {
            hashSet.add(num);
        }
        // 维护一个记录连续数字长度最长的变量
        int longestStreak = 0;
        // 遍历Set集合元素
        for (int num : hashSet) {
            // 对于num如果集合中不存在num - 1,那么就说明这个数字
            // 可以作为最长连续数字的开头,否则就不行
            if (!hashSet.contains(num - 1)) {
                // 记录当前的元素
                int currentNum = num;
                // 记录连续数字出现的次数
                int currentStreak = 1;
                // 查询是否存在连续数字序列,并记录其长度
                while (hashSet.contains(currentNum + 1)) {
                    currentNum += 1;
                    currentStreak++;
                }
                longestStreak = Math.max(longestStreak, currentStreak);
            }
        }
        return longestStreak;
    }
}

题目链接:题单 - 力扣(LeetCode)全球极客挚爱的技术成长平台

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值