📅  最后修改于: 2023-12-03 15:08:00.288000             🧑  作者: Mango
给定一个大小为 n 的排序数组 nums,其中存在一个重复的元素,请找出这个重复的元素。
最简单的方法就是遍历数组,找到重复的元素。
def findDuplicate(nums):
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[i] == nums[j]:
return nums[i]
时间复杂度为 O(n^2),并不是最优解。
可以用哈希表来记录数组中出现过的元素,遇到重复的元素直接返回。
def findDuplicate(nums):
hash_table = {}
for num in nums:
if num in hash_table:
return num
hash_table[num] = 1
时间复杂度为 O(n),但是需要额外的哈希表存储空间。
由于数组已经排序,重复的元素一定是相邻的,可以通过二分查找来实现。
首先设定左右指针,计算中间位置。如果中间位置的值小于等于 mid,则说明重复元素在右边,将左指针移到 mid+1,否则重复元素在左边,将右指针移到 mid-1。最后左指针的值就是重复的元素。
def findDuplicate(nums):
left, right = 0, len(nums) - 1
while left < right:
mid = (left + right) // 2
count = 0
for num in nums:
if num <= mid:
count += 1
if count > mid:
right = mid
else:
left = mid + 1
return left
时间复杂度为 O(nlogn)。
参考资料: