题目描述
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3
限制:
2 <= n <= 100000
本题最简单的办法就是开一个map,遍历数组中每个数字,如果遍历到的数字已经在map里了就返回,否则添加到map中。但是这样没有用到题目中的一个条件:所有数字都在0~n-1范围内,而数组长度为n,所以可以把这个数字范围看做是数组的索引。另一个思路就是将遍历每个数字,将数字都放回到他对应索引的位置上,然后在放回的过程中发现有重复数字就返回,这样避免了引入额外空间。
具体做法:遍历每个位置的数 i ,如果该位置的索引 pos 等于位置的数字 i ,则跳过。否则将判断索引为 i 的位置上的数是否与当前数相同,若相同则程序终止,否则将该位置的数 i 与 索引为 i 的位置的数交换,将这个数放到他原有的位置上。然后再次判断这个位置的数字是否与索引相同,然后重复上面的过程。代码如下:
class Solution(object):
def findRepeatNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
pos=0
while True:
if nums[pos] != pos:
if nums[pos] == nums[nums[pos]]:
return nums[pos]
temp=nums[nums[pos]]
nums[nums[pos]]=nums[pos]
nums[pos]=temp
else:
pos+=1