【最长连续序列问题】

来源:互联网 发布:软件测试薪资到底怎样 编辑:程序博客网 时间:2024/05/02 00:34
问题

  给定一个未排序的整数数组,求最长的连续序列的长度。要求算法的时间复杂度在XP系统下载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

  }

  }

  解法思路:

  因为要求xp系统之家复杂度是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;

  }