求数组中包含的最长子序列

问题描述:

Given an int array which might contain duplicates, find the largest subset of it which form a sequence.
Eg. {1,6,10,4,7,9,5}
then ans is 4,5,6,7

解答:线性时间,空间为常数(该数组中最大元素的值)

算法:

   1:  public int[] longestConsecutiveSequence(int[] a) 
   2:          {
   3:                  int first = Integer.MAX_VALUE; // the first number of the maximum consecutive sequence
   4:                  int length = 0; // the length of the maximum consecutive sequence
   5:                  Map<Integer, Integer> table = new HashMap<Integer, Integer>();
   6:                  for(int i: a) {
   7:                          if(!table.containsKey(i)) {
   8:                                  int start = i;
   9:                                  int end = i;
  10:                                  if(table.containsKey(i + 1) && table.get(i + 1) >= i + 1) {
  11:                                          end = table.get(i + 1);
  12:                                          table.remove(i + 1);
  13:                                          table.remove(end);
  14:                                  }
  15:                                  if(table.containsKey(i - 1) && table.get(i - 1) <= i - 1) {
  16:                                          start = table.get(i - 1);
  17:                                          table.remove(i - 1);
  18:                                          table.remove(start);
  19:                                  }
  20:                                  table.put(start, end);
  21:                                  table.put(end, start);
  22:                                  if(end - start + 1 > length) {
  23:                                          first = start;
  24:                                          length = end - start + 1;
  25:                                  }
  26:                          }
  27:                  }
  28:                  System.out.println(table);
  29:                  System.out.println(length);
  30:                  int[] s = new int[length];
  31:                  for(int i = 0; i < length; i++) s[i] = first + i;
  32:                  return s;
  33:          }

posted on 2013-10-22 08:36  苯苯吹雪  阅读(259)  评论(0编辑  收藏  举报

导航