在 int 数组中查找第一个副本,java
这是我遇到的一个常见的面试问题,但是我未能按照要求的方式改进它。
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),布尔[] b = 新的布尔[n];但是我不允许使用此方法。
-
然后我想到使用int变量,使用位操作,如果最大数字小于32,那么对于n,我们可以将1位推到n位左转并|到一个检查器,然后和检查器到数组中的下一个条目,以检查它是否>0。例如:
int c = A[i]; if(check & (1 << c) > 0) return false; check |= 1 << c;
但是,这也是不允许的。
所以有一个提示,我可以将数组本身用作哈希集/哈希表,以及“线性哈希”?
任何帮助?谢谢