剑指offer_03_数组中重复的数字
描述
简单
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
解题
排序,然后看相邻元素是否相同
class Solution:
def findRepeatNumber(self, nums) -> int:
nums.sort()
n = len(nums)
for i in range(n-1):
if nums[i] == nums[i+1]:
return nums[i]
使用 collections包,可以统计出每个元素出现次数
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
from collections import Counter
c = Counter(nums)
for n in nums:
if c[n] > 1:
return n
借助字典,哈希
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
dic = {}
for n in nums:
if n not in dic:
dic[n] = 1
else:
return n
列表中的数据范围是[0, len(nums)]
,且数组长度为n
如果没有发生重复,可以将原数组转化为一种特殊情况:
在位置i
的地方放置nums[i]
,即i=nums[i]
,如 [0,1,2,3,4]
当i!=nums[i]
时,需要将nums[i]
放在它所属的位置上,nums[i]
和nums[nums[i]]
进行交换
如 [0,4,3,2,2]
- 当
i=1
时 - 将
i
位置上的元素nums[i]
和nums[i]
位置上的元素nums[nums[i]]
交换 - 得
[0,2,3,2,4]
i
仍然不等于nums[i]
,交换- 得
[0,3,2,2,4]
i
仍然不等于nums[i]
,交换- 得
[0,2,2,3,4]
i
仍然不等于nums[i]
,但是用于交换的两个数相等,出现了重复,返回
class Solution:
def findRepeatNumber(self, nums) -> int:
n = len(nums)
for i in range(n):
while i != nums[i]:
if nums[i] == nums[nums[i]]:
return nums[i]
temp = nums[i]
nums[i], nums[temp] = nums[temp], nums[i]