【思路1】哈希表
class Solution:
def findRepeatNumber(self, nums: List[int]) -> int:
dic = collections.Counter(nums)
for num in nums:
if dic[num] > 1:
return num
return False
时间复杂度O(n),空间复杂度O(n)
【思路2】排序
- 先排序
- 比对值pre 先初始化为nums[0]
- 依次比对数组nums中是否存在该值:
若存在(即重复),则返回该值;
不存在,则下一个num值为pre.
class Solution(object):
def findRepeatNumber(self, nums):
nums.sort()
pre = nums[0]
for index in range(1, len(nums)): # 1到(n-1)
if pre == nums[index]:
return pre
pre = nums[index]
'''
作者:xiao-xue-66
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/pythonti-jie-san-chong-fang-fa-by-xiao-xue-66/
来源:力扣(LeetCode)
'''
时间复杂度O(nlogn),空间复杂度O(1)
【思路3】原地交换
∵ 在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范围内
∴ 数组元素的 索引 和 值 是 一对多 的关系
遍历中,第一次遇到数字 x 时,将其交换至索引 x 处;
而当第二次遇到数字 x 时,一定有 nums[x] = x,此时即可得到一组重复数字。
算法流程:
-
遍历数组 numsnums ,设索引初始值为 i = 0i=0 :
- 若 nums[i] = i: 说明此数字已在对应索引位置,无需交换,因此跳过;
- 若 nums[nums[i]] = nums[i] : 代表索引 nums[i] 处和索引 i 处的元素值都为 nums[i] ,即找到一组重复值,返回此值 nums[i];
- 否则: 交换索引为 i 和 nums[i] 的元素值,将此数字交换至对应索引位置。
-
若遍历完毕尚未返回,则返回 -1
class Solution:
def findRepeatNumber(self, nums: [int]) -> int:
i = 0
while i < len(nums):
if nums[i] == i:
i += 1
continue
if nums[nums[i]] == nums[i]:
return nums[i]
nums[nums[i]], nums[i] = nums[i], nums[nums[i]]
return -1
'''
作者:jyd
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/mian-shi-ti-03-shu-zu-zhong-zhong-fu-de-shu-zi-yua/
来源:力扣(LeetCode)
'''
- 时间复杂度 O(N) :遍历数组使用 O(N),每轮遍历的判断和交换操作使用 O(1) 。
- 空间复杂度 O(1) : 使用常数复杂度的额外空间。