剑指03:数组中重复的数字
题目:剑指 Offer 03. 数组中重复的数字(E)

解题思路1:
首先看到题,第一眼就想到使用字典、列表或者集合等容器进行存储,如果查到在容器中已经存在,则返回该数。
时间:\(O(N)\)
空间:\(O(N)\)
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
dic = {}
for i in nums:
if i in dic: return i
dic[i] = 1
return
优质解答:原地交换(参考自K神)
遍历数组,由于数组的特殊性,n个数的大小都在\([0,n-1]\)内,碰到数则判断其是否在自己按照大小排序的位置上,如0应该在数组的第一位即nums[0],如果不在,则将其与自己顺位上的数进行交换同时进行判断,如果该数与自己相同,则代表遇到了重复数字,直接将其返回即可;如果不同,则进行交换,交换后此时自己已经在顺位上,此时继续判断交换的数是否来到他的顺位上,如果不在其顺位上则继续进行交换,直到进行交换的两个数都来到顺位上,此时i+1继续往后遍历直到数组末端。
时间:\(O(N)\)
空间:\(O(1)\)
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
for i in range(len(nums)):
while nums[i] != i:
if nums[i] == nums[nums[i]]: return nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
return
遇到问题及解决方法:
- 在选用容器时需要注意其查找的时间复杂度,list的查找复杂度为\(O(N)\),字典和集合则是\(O(1)\),其本质都是哈希表,Python3.7以后字典为有序,而集合无序,所以一般选用字典即可。

浙公网安备 33010602011771号