最长的连续子序列,没有重复的数字

时间:2016-03-29 18:19:12

标签: algorithm sequence

我有以下任务:

  

查找最长连续子序列的长度,使其中包含所有数字   是独一无二的。

现在,如果我不假设我的序列中的元素不是来自某个固定字母,但它们可以是,例如,任意数字,这个任务是否仍然可以在线性时间内解决?

1 个答案:

答案 0 :(得分:2)

这可以使用两个指针和一组元素来解决。让i为头指针,j为尾指针,均为零。

对于每个索引i,添加元素S[i],其中S是集合中的序列,如果集合中不存在该元素。如果确实存在,则将j递增到S[i] == S[j-1],从集合中删除每个元素。在循环结束时,存储元素集的最大大小。

这是线性时间,因为两个指针在最多n次迭代序列,并且哈希集上的contains()remove()add()是分摊的常量时间。

int longestUnique(int[] S) {
  HashSet<Integer> elements = new HashSet<Integer>();
  int longest = 0;
  for (int i = 0, j = 0; i < S.length; i++) {
    if (elements.contains(S[i])) {
      do {
        elements.remove(S[j]);
      } while (S[j++] != S[i]);
    }
    elements.add(S[i]);
    longest = Math.max(longest, i - j + 1);
  }
  return longest;
}