以 LeetCode 剑指 Offer 03. 数组中重复的数字 为例
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
使用列表:
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
lis = []
for n in nums:
if n in lis:
return n
lis.append(n)
使用字典
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
dic = set()
for i in nums:
if i in dic:
return i
dic.add(i)
时间对比
上面是字典,下面是列表,可以看到字典明显要快
原理
在python中,字典的储存是哈希表,通过健值直接进行检索
而列表的读取靠的是偏移,即对列表每一个元素都进行判断
该题另一种方法
原地交换
自我理解:本质是无重复的排序,在找到索引0的时候,前几步的试验已经将几个位置排好了,即每次试验排好一个位置
所以复杂度为On