在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。
# 解题思路一:先把输入数组排序,然后从排序后的数组中从前往后找。
class Solution1:
def duplicate1(numbers, duplications):
if numbers == None or len(numbers) <= 0:
return False
for i in range(len(numbers)):
if numbers[i] <=0 or numbers[i] > (len(numbers)-1):
return False
numbers.sort()
for i in range(len(numbers)):
if numbers[i] == numbers[i+1]:
duplications = numbers[i]
return True
return False
# 解题思路二:使用辅助空间:哈希表。时间复杂度为O(n),空间复杂度为O(n)
class Solution2:
def duplicate2(self,numbers, duplication):
if numbers == None or len(numbers) <= 0:
return False
for i in range(len(numbers)):
if numbers[i] <= 0 or numbers[i] > (len(numbers) - 1):
return False
usedic = set()
for i in range(len(numbers)):
if numbers[i] not in usedic:
usedic.add(numbers[i])
return False
else:
duplication = numbers[i]
return True
return False
# 解题思路三:利用书上的方法:将其两两交换,时间复杂度为O(n)
class Solution3:
def duplicate3(self,numbers, duplication):
if numbers == None or len(numbers) <= 0:
return False
for i in range(len(numbers)):
if numbers[i] <= 0 or numbers[i] > (len(numbers) - 1):
return False
for i in range(len(numbers)):
if numbers[i] != i:
if numbers[i] == numbers[numbers[i]]:
duplication = numbers[i]
return True
numbers[i], numbers[numbers[i]] = numbers[numbers[i],numbers[i]]
return False