哈希表。时间o(n),空间o(n)
class Solution:
def duplicate(self , numbers: List[int]) -> int:
# write code here
numberset = set([i for i in range(len(numbers))])
for number in numbers:
if number not in numberset:
return number
else:
numberset.remove(number)
return -1
交换元素。时间o(n),空间o(1)
class Solution:
def duplicate(self , numbers: List[int]) -> int:
# write code here
for i in range(len(numbers)):
while numbers[i] != i:
if numbers[i] == numbers[numbers[i]]:
return numbers[i]
numbers[numbers[i]], numbers[i] = numbers[i], numbers[numbers[i]]
return -1
如果是n+1长度分布在[0,n]区间,即长度比值区间范围至少大1。那么可以用下面的二分法,好处是不修改数组。时间o(nlogn),空间o(1)
class Solution:
def duplicate(self , numbers) -> int:
# write code here
def countNums(numbers, m, n):
return sum(True for number in numbers if m<=number<=n)
st, ed = 0, len(numbers)-1
while st < ed:
mid = (st+ed)//2
print("st, mid, ed", st,mid,ed, countNums(numbers, st, mid))
if countNums(numbers, st, mid) > mid-st+1:
ed = mid
else:
st = mid+1
return st