以下是我遇到的一个常见面试问题,但是我未能以所需的方式改进它。
assume we have an int array int[] A, we want to find the first duplicate entry.
几乎每个人都能考虑使用 HashSet,并在解析过程中添加元素,这将导致 O(n) 的时间复杂度和 O(n) 的空间复杂度。然后我被要求在不使用其他数据结构的情况下解决这个问题。我说最蠢的想法是在 O(n^2) 的时间内比较每个元素。然后我被要求优化 O(n^2) 的时间。
为了改进它,我想到了使用固定大小的数组(假设最大数字为 n),boolean[] b = new boolean[n]。但是我不能使用这种方法。
然后我想到了使用一个 int 变量,并使用位运算。如果最大数小于 32,则对于 n,我们可以将 1 推到 n 位左边并 | 到一个检查器上,然后 & 检查器与数组中的下一个条目进行比较以检查是否 > 0。 例如:
int c = A[i]; if(check & (1 << c) > 0) return false; check |= 1 << c;
然而这也是不被允许的。
所以有一个提示说我可以使用数组本身作为哈希集/哈希表,并使用“线性哈希”?
有任何帮助吗?谢谢。
{1,2,2,1}
中,是数字1还是数字2作为第一个重复项? - amit