https://oj.leetcode.com/problems/longest-consecutive-sequence/
Longest Consecutive Sequence
Given an unsorted array of integers, find the length of the longest consecutive elements sequence.
For example,
Given [100, 4, 200, 1, 3, 2]
,
The longest consecutive elements sequence is [1, 2, 3, 4]
. Return its length: 4
.
Your algorithm should run in O(n) complexity.
这个题是一个求最大连续序列长度的问题,是我做LeetCode题目以来自己解决的问题当中觉得最完美的,问题的时间复杂度要求是线性的,
我首先想到的是,开辟一个大数组可以包括最大值和最小值之间的所有数,然后求最大连续序列长度,首先这个数组的大小是无法控制的,很明显的超出了数组的范围,也超出了问题的空间限制。
其次想到的是,不储存第一个想法中的最小值和最大值之间的数,而是将原题中的数储存在一个哈希表中,然后依次遍历最小值和最大值之间的数,通过查找哈希表来确定该数有没有,从而得出最大连续序列长度,最后超时了。
最后想到的是,用两个哈希表,一个哈希表储存原题目中的数,然后依次遍历这些数,另一个哈希表储存已经遍历过得数防止重复计算,然后以这个数为基准左右扫描,求连续序列长度。负责度为O(N)。
代码如下:
public int longestConsecutive(int[] num) { if(num.length==0){ return 0; } int minvalue = Integer.MAX_VALUE; int maxvalue = Integer.MIN_VALUE; //储存原题目中的数 HashMap<Integer, Integer>numHashMap = new HashMap<Integer, Integer>(); //储存已经访问过得数 HashMap<Integer, Integer>visitedHashMap = new HashMap<Integer, Integer>(); for (int i = 0; i < num.length; i++) { if(minvalue>num[i]){ minvalue = num[i]; } if(maxvalue<num[i]){ maxvalue = num[i]; } numHashMap.put(num[i], num[i]); } int maxlength = 1; int length = 1; for(int i =0; i<num.length; i++){ //以num[i]为基准,求连续序列长度 if(visitedHashMap.get(num[i])==null){ visitedHashMap.put(num[i], num[i]); length = 1; int j=1; while(numHashMap.get(num[i]-j)!=null){ length++; visitedHashMap.put(num[i]-j, num[i]-j); j++; } j=1; while(numHashMap.get(num[i]+j)!=null){ length++; visitedHashMap.put(num[i]+j, num[i]+j); j++; } if(maxlength<length){ maxlength = length; } } } return maxlength; }