#我的方法 :记录数组的各个数字,当有重复数字时直接返回
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
dic =[]
for num in nums:
if num in dic:
return num
else:
dic.append(num)
return -1
#大神的方法
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
i=0
while i<len(nums):
if nums[i]==i:#交换 直到nums[0]=0
i+=1
continue
if nums[i]==nums[nums[i]]:#nums[4]=2 = nums[nums[4]]=nums[2]=2
return nums[i]
t,p=nums[i],nums[nums[i]]#交换 直到nums[0]=0
nums[nums[i]]=t#先改这个,否则nums[i]就变了 变为nums[2]=2
nums[i]=p
return -1
TIP:每次交换都保证了一个元素会放在正确的位置,而能刚好放在正确位置的次数最多不超过n,所以不会死循环,在有限次数内一定能发现重复元素。
参考链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/mian-shi-ti-03-shu-zu-zhong-zhong-fu-de-shu-zi-yua/