我有以下任务:
查找最长连续子序列的长度,使其中包含所有数字 是独一无二的。
现在,如果我不假设我的序列中的元素不是来自某个固定字母,但它们可以是,例如,任意数字,这个任务是否仍然可以在线性时间内解决?
答案 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;
}