最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度。
要求算法的时间复杂度为 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;
}
}