【最长连续序列问题】
问题
给定一个未排序的整数数组,求最长的连续序列的长度。要求算法的时间复杂度在O(n)
比如对于数组[100, 4, 200, 1, 3, 2],其中最长序列为[1,2,3,4],所以应该返回4
public class Solution {
public int longestConsecutive(int[] num) {
//write your code here
}
}
解法思路:
因为要求复杂度是O(n),可以考虑使用哈希表进行查询。使用两个HashMap分别记录序列的开始值和结束值。遍历数组,如果发现比该元素大1的开始值或者比改元素小1的结束值,均进行合并工作。
不多说了,看代码。
private static class Sequence{
int start;
int end;
int length;
}
public int longestConsecutive(int[] num) {
int len =0;
if(num==null || (len=num.length)<1){
return 0;
}
Map<Integer,Sequence> start = new HashMap<Integer,Sequence>();
Map<Integer,Sequence> end = new HashMap<Integer,Sequence>();
int maxLength = 0;
for(int i=0;i<len;++i){
Sequence s = null;
int v = num[i];
if(start.containsKey(v) || end.containsKey(v)){
continue;
}
if(start.containsKey(v+1)){
s = start.remove(v+1);
s.start = v;
++s.length;
while(end.containsKey(s.start-1)){ //merge ends
Sequence m = end.remove(s.start-1);
start.remove(m.start);
s.start = m.start;
s.length += m.length;
}
start.put(s.start, s);
}
else if(end.containsKey(v-1)){
s = end.remove(v-1);
s.end = v;
++s.length;
while(start.containsKey(s.end+1)){ //merge starts
Sequence m = start.remove(s.end+1);
end.remove(m.end);
s.end = m.end;
s.length += m.length;
}
end.put(s.end, s);
}
else{
s = new Sequence();
s.start = s.end = v;
s.length = 1;
start.put(v,s);
end.put(v,s);
}
//System.out.println(i+" "+v+" seqence:"+s.start+"/"+s.end+"/"+s.length);
if(maxLength<s.length){
maxLength = s.length;
}
}
return maxLength;
}
更多精彩教程请关注:电脑系统