题目描述:
找出数组中重复的数字。
一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。
数组中某些数字是重复的,但不知道有几个数字重复了,
也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
方法1:
将数组变为有序,依次扫描有序数组,若出现重复数字,则返回该值
def find1(nums):
nums.sort()
for i in range(len(nums)-1):
if nums[i] == nums[i+1]:
return nums[i]
复杂度分析:python中的sort()是基于快排实现的,所以时间复杂度为O(NlogN),空间复杂度为O(1)。
方法2:
利用字典,统计每个数字出现的次数,返回出现次数大于1的数字
def find2(nums):
#dict.fromkeys设置任意的value
numdict = dict.fromkeys(nums,0)
for i in nums:
if i in numdict:
numdict[i] += 1
if numdict[i] > 1:
return i
复杂度分析:时间复杂度为O(N),空间复杂度为O(N)。
方法3:
重排数组。从左到右依次扫描数组,判断第i个数字nums[i]是否和i相等。若相等,则扫描下一个;若不等,则将第i个数字和第nums[i]个数字进行比较,相等的话则返回该值,不等的话将两者交换。重复该过程,直到找到重复的数字。
def find3(nums):
for i in range(len(nums)):
while i != nums[i]:
if nums[i] == nums[nums[i]]:
return nums[i]
else:
temp = nums[i]
nums[i] = nums[temp]
nums[temp] = temp
复杂度分析:时间复杂度为O(N),空间复杂度为O(1)。