题目
给出一个无序的整形数组,找出最长连续子串的长度。线性时间复杂度
{8,1,9,3,2,4}———-连续子串—–{1,2,3,4}—-长度是4
算法
- 记录数字和其所在的连续数组的长度
- 插入数字
- 判断其前一个数和后一个数,是否在hash里
- 如果存在,更新连续数组长度
O(n)
import java.util.*;
class Solution{
public int findLongestConsequence(int[] A){
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
int max=1;
for(int i:A){
if(map.containsKey(i)) continue;//忽略重复值
map.put(i,1); //添加(key,value)
if(map.containsKey(i-1)){ //连接左边的元素
max=Math.max(max, merge(map,i-1,i));
}
if(map.containsKey(i+1)) //连接右边
max=Math.max(max,merge(map,i,i+1));
}
return max;
}
private int merge(HashMap<Integer,Integer> map,int left,int right){
int upper=right+map.get(right)-1; //最右边数
int lower=left-map.get(left)+1;//最左边数
int len=upper-lower+1;
map.put(upper,len);
map.put(lower,len);
}
}