[程序员代码面试指南]递归和动态规划-数组中的最长连续序列
题目
给定无需数组arr,返回器中最长的连续序列的长度。
举例子:arr=[100,4,200,1,3,2],最长连续序列为[1,2,3,4],返回4.
题解
法一:排序,再遍历找。时间复杂度O(nlogn),空间复杂度O(n)
法二:
- 用map,key代表遍历过的某个数,value代表key这个数所在的最长连续序列的长度。
- 遍历arr,只处理没出现过的。
- 遍历key,map加(key,1),再找key+1,key-1,表示连续段的连接。然后只更新的连续序列的头和尾的key的value值,因为连续序列中间的元素左右两边的元素都已经加入到过map过了不会再处理。
- 时间复杂度O(n),空间复杂度O(n).
代码(法二)
import java.util.HashMap;
public class Main {
public static void main(String args[]) {
int[] arr= {100,4,200,1,3,2};
System.out.println(longestContinueSeqLen(arr));
}
public static int longestContinueSeqLen(int[] arr){
if(arr==null||arr.length==0) {
return 0;
}
HashMap<Integer,Integer> map=new HashMap<>();
int maxLen=Integer.MIN_VALUE;
for(int num:arr) {
if(!map.containsKey(num)) {
map.put(num, 1);
int endKey=num;
if(map.containsKey(num+1)) {
int len=map.get(num+1);
endKey=num+len;
int newLen=len+1;
map.put(endKey, newLen);
map.put(num, newLen);
maxLen=maxLen>newLen?maxLen:newLen;
}
if(map.containsKey(num-1)) {
int len=map.get(num-1);
int begKey=num-len+1;
int newLen=len+map.get(num);
map.put(begKey, newLen);
map.put(endKey,newLen);
maxLen=maxLen>newLen?maxLen:newLen;
}
}
}
return maxLen;
}
}
posted on 2019-06-23 12:04 coding_gaga 阅读(146) 评论(0) 编辑 收藏 举报