题目描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
方法一 设置两个循环 时间复杂度过高
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
i = 0
while i < len(nums):
j = i+1
while j <len(nums):
if nums[i] == nums[j]:
# print(nums[i])
return nums[i]
j+=1
i+=1
return
方法二 利用集合set()
#集合中还没,就把有把元素一个个加入其中,如果有了就找到相同的
class Solution:
def findRepeatNumber(self,nums:List[int]) -> int:
dic = set()
for num in nums:
if num in dic:
return num
dic.add(num)
return -1
方法三 排序后看相邻的两个数是否相等
#方法三 排序后看相邻两个数是否相等
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
nums.sort()
i = 0
while i < len(nums)-1:
if nums[i]==nums[i+1]:
return nums[i]
i += 1
return -1
方法四 把元素与索引值对应
# 方法四 把元素值与索引对应
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
i = 0
while i<len(nums):
if nums[i] == i:
i += 1
continue
if nums[nums[i]] == nums[i]:
return nums[i]
#当前值,与以当前值为索引的值交换位置
temp = nums[nums[i]]
nums[nums[i]] = nums[i] #把当前值放到,索引也是当前值的位置
nums[i] = temp #而当前位置,放到刚刚索引是当前值位置的那个值
return -1
例子:
以当前值为索引的是第五个位置,如果第五个位置的值num[nums[i]]不是当前值nums[i],则将当前值放到第五个位置;如果第五个位置的值已经是当前值,则找到重复的数。