每日一LeetCode:最长连续子序列

目录

解题过程:

描述:

分析条件:

解题思路:

通过这道题可以学到什么:


解题过程:

描述:

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

分析条件:

1.未排序,就是让你自己去排序

2.从示例可以看出

元素可以重复

那我们的解题思路:

排序并去重

难点:如何去重,如何找到连续子序列的最大值

去重:利用set集合(无序)

找到最大值:利用Hash表

解题思路:

class Solution {
    public int longestConsecutive(int[] nums) {
        if(nums.length == 0){
            return 0;
        }
        //定义结果变量
        int ans = 0;
        //创建set集合
        Set<Integer> st = new HashSet<>();
        //将nums转为set集合
        for(int num : nums){
            st.add(num);
        }
        //遍历set集合,以每个序列的起点出发
        for(int x : st){
            //排除非起点数
            if(st.contains(x - 1)){
                continue;
            }
            //此数作为起点,寻找最长子序列
            int y = x + 1;
            //最终y = 终点数 + 1
            while(st.contains(y)){
                y++;
            }
            ans = Math.max(ans,y - x);
        }
        return ans;
    }
}

通过这道题可以学到什么:

1.使用set来排除重复元素

2.set集合添加元素add,判断元素是否在set中,contains()方法

3.思想:找连续子序列,从头开始找,通过st.contains(x-1)判断它是不是头结点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值