📌  相关文章
📜  查找1到n-1之间的唯一重复元素(1)

📅  最后修改于: 2023-12-03 15:10:42.923000             🧑  作者: Mango

查找1到n-1之间的唯一重复元素

在一组长度为n的数组中,包含从1n-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)