您的位置:首页 > 产品设计 > UI/UE

LeetCode Longest Consecutive Sequence

2015-01-15 22:06 260 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: