一尘不染

在O(n)和恒定空间中查找重复项

algorithm

我在一个论坛上看到了一个有趣的问题。

您有100个元素(从1到100),但是很容易出错,这些数字之一通过重复自身而与另一个重叠。例如1,99,3,…,99,100数组不是排序格式,如何找到重复编号?

我知道Hash可以做到O(n)时间和O(n)空间,我需要O(1)空间。


阅读 232

收藏
2020-07-28

共1个答案

一尘不染

我们可以在O(n)和恒定空间中做到这一点:

  1. 对于每个元素,计算 index = Math.abs(a[i]) - 1
  2. 检查值 index
    • 如果为正,则乘以-1,即使其为负。
    • 如果为负,则返回(index+1)作为答案,因为这意味着我们之前已经看到过该索引。

static int findDup(int[] a){
    for(int i=0;i<a.length;i++){
        int index = Math.abs(a[i]) - 1;
        if(a[index] < 0)
            return index+1;
        else
            a[index] = -1 * a[index];
    }
    return -1;
}
2020-07-28