[程序员代码面试指南]递归和动态规划-数组中的最长连续序列

题目

给定无需数组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编辑  收藏  举报

导航