📅  最后修改于: 2023-12-03 15:10:42.923000             🧑  作者: Mango
在一组长度为n
的数组中,包含从1
到n-1
的所有整数,其中只有一个整数重复了一次。现在需要写一个函数来查找这个重复的整数。
使用一个哈希表来记录已经出现的数字,当遍历到重复的数字时,即可找到答案。
def findDuplicate(nums: List[int]) -> int:
hashset = set()
for num in nums:
if num in hashset:
return num
hashset.add(num)
时间复杂度:O(n)
空间复杂度:O(n)
将数组排序后,遍历数组,当前元素与前一个元素相同时即为重复元素。
def findDuplicate(nums: List[int]) -> int:
nums.sort()
for i in range(1, len(nums)):
if nums[i] == nums[i-1]:
return nums[i]
时间复杂度:O(nlogn)
空间复杂度:O(1)
将数组看作链表,数组中的元素表示链表中的节点,数组中的元素的值表示指向下一个节点的指针。因为有一个数字出现了两次,所以数组中一定存在环,问题转化为求环的起点。
使用快慢指针,假设慢指针每次移动一步,快指针每次移动两步,当它们第一次相遇时,慢指针走的路程是快指针的一半,即
a + b = slow
a + b + n*b = fast
2*(a + b) = a + b + n*b
a = (n-1)*b + (c-a)
令一个指针从起点开始,另一个指针从相遇点开始,每次移动一步,最终它们在环的起点相遇,即为所求的重复元素。
def findDuplicate(nums: List[int]) -> int:
slow, fast = nums[0], nums[nums[0]]
while slow != fast:
slow = nums[slow]
fast = nums[nums[fast]]
ptr1, ptr2 = nums[0], slow
while ptr1 != ptr2:
ptr1 = nums[ptr1]
ptr2 = nums[ptr2]
return ptr1
时间复杂度:O(n)
空间复杂度:O(1)