在O(n)和恒定空间中查找重复项
问题内容:
我在一个论坛上看到了一个有趣的问题。
您有100个元素(从1到100),但是很容易出错,这些数字之一通过重复自身而与另一个重叠。例如1,99,3,…,99,100数组不是排序格式,如何找到重复编号?
我知道Hash可以做到O(n)时间和O(n)空间,我需要O(1)空间。
问题答案:
我们可以在O(n)和恒定空间中做到这一点:
- 对于每个元素,计算
index = Math.abs(a[i]) - 1
- 检查值
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;
}