描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任一一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
讨论组有看到一个替换法,博主说原理是
遍历nums数组,对每个元素,令其作为索引,使其指向的元素为负数。
- 当元素映射到一个负数,说明此映射之前出现过,找到重复项。
按照代码走了一遍,大概可以理解了:
class Solution:
def duplicate(self , numbers ):
# write code here
if not numbers:
return -1
n = len(numbers)
for i in range(n):
v = numbers[i]
if v < 0:
v += n
if numbers[v] < 0:
return v
numbers[v] -= n
return -1
初始状态:[2,3,1,0,2,5,3]
n = 7
for i in range(n):
v = numbers[i]
第一次for:[2,3,1,0,2,5,3]
代入v = 2:此时v不小于0,numbers[2]为1也不小于0,所以numbers[2] -= 7,也就是1减去7变成-6.
第二次for:[2,3,-6,0,2,5,3]
代入v = 3:此时v不小于0,numbers[3]为0也不小于0,所以numbers[3] -= 7,也就是0减去7变成-7.
第三次for:[2,3,-6,-7,2,5,3]
代入v = -6:此时v小于0,所以v += 7,也就是-6加上7变成1.此时numbers[1]=3还是不小于0,numbers[1] -= 7,也就是3减去7变成-4.
第四次for:[2,-4,-6,-7,2,5,3]
代入v = -7:此时v小于0,所以v += 7,也就是-7加上7变成0.此时numbers[0]=2还是不小于0,numbers[0] -= 7,也就是2减去7变成-5.
第五次for:[-5,-4,-6,-7,2,5,3]
代入v = 2:此时v不小于0,numbers[2]为-6小于0,所以return 2.