题目描述
找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:2 <= n <= 100000
解题思路1: hash map
重复数据, 我们首先想到的就是使用map记录, 当找到map中的值时, 说明这个元素已经被记录过了.
时间复杂度: O(n)
示例代码1:
def findRepeatNumber(nums: [int]) -> int:
temp = {}
for n in nums:
if n not in temp:
temp[n] = 1
else:
return n
解题思路2: 自身map
对于使用map来说, 我们多开辟了一个map空间, 空间复杂度会变成O(n). 根据题目的限制, 数组的长度为n, 并且元素值是 0~n-1, 所以我们刚好可以使用数组的下标index来当做map的key, 然后, 通过遍历, 将与key相等的元素通过交换, 放到对应的index上, 也就是类似 [0, 1, 2...], 当我们再次遍历到与index相等, 并且index位置上现有的元素也相等,那么这个元素就是重复的元素.
时间复杂度: O(n)
示例代码2:
def findRepeatNumber(nums: [int]) -> int:
i = 0
while i < len(nums):
if nums[i] != i:
if nums[nums[i]] == nums[i]:
return nums[i]
else:
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
else:
i += 1