在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
Input:
{2, 3, 1, 0, 2, 5}
Output:
2
解题思路
要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。
对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上进行求解。
以 (2, 3, 1, 0, 2, 5) 为例,遍历到位置 4 时,该位置上的数为 2,但是第 2 个位置上已经有一个 2 的值了,因此可以知道 2 重复:
def onlyone(nums):
le = len(nums)
for i in range(le):
if i != nums[i]:
if nums[i] == nums[nums[i]]:
print(nums)
return nums[i]
index = nums[i]
nums[i], nums[index] = nums[index], nums[i]
return -1
def onlyone2(nums):
le = len(nums)
for i in range(le):
while i != nums[i]:
if nums[i] == nums[nums[i]]:
print(nums)
return nums[i]
index = nums[i]
nums[i], nums[index] = nums[index], nums[i]
return -1
class Solution:
# 这里要特别注意~找到任意重复的一个值并赋值到duplication[0]
# 函数返回True/False
def duplicate(self, nums, duplication):
# write code here
le = len(nums)
for i in range(le):
while i != nums[i]:
# 将nums[i]试做索引,与索引为i的数进行交换
if nums[i] == nums[nums[i]]:
duplication[0] = nums[i]
return True
index = nums[i]
nums[i], nums[index] = nums[index], nums[i]
return False
print(Solution().duplicate([1, 0, 2, 4, 4, 5], [-1]))
print(onlyone([2, 3, 1, 0, 2, 5]))
print(onlyone2([2, 3, 1, 0, 2, 5]))
# 使用if判断,则对于已经过去的索引i不会进行再次判断
# [1, 0, 2, 3, 2, 5]
# 2
# [0, 1, 2, 3, 2, 5]
# 2