这是我遇到的一个常见面试问题,但是我未能按照要求的方式改进它。
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;
但是,这也是不允许的。
所以有一个提示,我可以将数组本身用作哈希集/哈希表和“线性哈希”?
有什么帮助吗?谢谢