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;
}