最长连续序列

最长连续序列

在这里插入图片描述
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 O(n)。

package factory;

import java.util.HashMap;

/**
 * @Description: 最长连续序列
 * https://leetcode-cn.com/explore/interview/card/top-interview-quesitons-in-2018/272/dynamic-programming/1176/
 * @Author: Jaryn
 * @Date: 2019/12/13 16:33
 */
public class LongestConsecutive {

    public static void main(String[] args) {
        int[] nums = new int[]{1,2,0,1};
        int result = longestConsecutive(nums);
        System.out.println(result);
    }

    /**
     * 1、利用map存储<num,左右出现的次数>
     * 2、假如出现的数字是:1、6、2、4、3、5  那么最后的值就是<1、6><2、2><3、4><4、4><5、6><6、6>
     * 3、主要的思想就是,比如当前是<1、2><2、2><6、1><4、1> 那么当插入3的时候。更新3为A,A = 左边+右边+1 = 2+1+1 =4
     *    <2、2>代表左边还有2个连续的,所以把边界1更新为<1, A>。<4、1>代表右边有一个连续的,所以更新边界4为<4, A>。
     *    每次都维护好边界的连续序列数是正确的,下一个插入的数就能拿到这个值继续计算
     * @param nums
     * @return
     */
    public static int longestConsecutive(int[] nums) {
        int max = 0;
        HashMap<Integer, Integer> maps = new HashMap<>();
        for(int num : nums) {
            if(maps.get(num) == null) { // 因为可能出现重复的数字,这时候不做任何操作
                int left = maps.getOrDefault(num - 1, 0);
                int right = maps.getOrDefault(num + 1, 0);
                int val = left + right + 1;
                maps.put(num, val);
                if (left != 0) {
                    maps.put(num - left, val);
                }
                if (right != 0) {
                    maps.put(num + right, val);
                }
                if (val > max) {
                    max = val;
                }
            }
        }
        return max;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值