剑指 Offer 03. 数组中重复的数字
class Solution:
# def findRepeatNumber(self, nums: List[int]) -> int:
# a = []
# for i in range(len(nums)):
# if nums[i] not in a:
# a.append(nums[i])
# else:
# return nums[i]
def findRepeatNumber(self, nums: List[int]) -> int:
#方法一:利用数组中的append,但时间复杂度o(n^2),空间复杂度为o(n),额外使用了一个列表
# a = []
# for num in nums:
# if num not in a:
# a.append(num)
# else:
# return num
# return -1
#方法二:先排序再找重复值,时间复杂度归并排序o(nlogn),空间复杂度o(1)
# n = len(nums)
# nums.sort()
# for i in range(1, n):
# if nums[i-1] == nums[i]:
# return nums[i]
# return -1
#方法三:哈希表,由于哈希表创建了键-值对,添加和查找的时候时间复杂度均为o(1);时间复杂度和空间复杂度均为o(n)
# dic = set() #哈希表
# for num in nums:
# if num in dic:
# return num
# dic.add(num) #注意哈希表添加元素的方式
# return -1
#方法四:交换,交换的过程中顺便查重,空间复杂度o(1),时间复杂度o(n)
# n = len(nums)
# for i in range(n):
# while i != nums[i]: #首先查看nums[i]是否就是i这个值,不是就与nums[i]为index的位置的值交换,是就找到了重复的值
# if nums[nums[i]] == nums[i]:
# return nums[i]
# else:
# nums[nums[i]],nums[i] = nums[i], nums[nums[i]] #注意使用原地交换的时候,不能先给nums[i]赋值,否则后一个的索引会变,换完之后还要判断新的nums[i]是否==i
# else:
# continue
# return -1
#方法四:交换,交换的过程中顺便查重
i = 0
while i < len(nums):
if nums[i] == i: #只有这种情况才能+1
i += 1
continue
if nums[nums[i]] == nums[i]: return nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
return -1