fgg blog

刷题之走火入魔解法

问题描述:给定一个包含 n + 1 个整数的数组,数字范围在 1 到 n 之间,其中有一个重复的数。 找出这个重复的数。

解法1: 平平无奇的思考结果,我想大部分人都会想到这个解法。

相似题目,参考:力扣 645. 错误的集合

def findDuplicate2(nums):
    nums_sum = sum(nums)
    sets_sum = sum(set(nums))
    return nums_sum - sets_sum

解法2: 这个解法如果没有个十年脑血栓,恐怕很难会想到把数组元素当成索引来变成链表耍,然后 还能想到环状链表的环起点是重复的那个元素。

相似题目,参考:力扣 LCR 022. 环形链表 II (单链表找环的入口节点)

def findDuplicate(nums):
    # 初始化慢指针和快指针
    slow = nums[0]
    fast = nums[0]

    # 快慢指针移动直到相遇
    while True:
        slow = nums[slow]       # 慢指针每次走一步
        fast = nums[nums[fast]] # 快指针每次走两步
        if slow == fast:
            break

    # 重置一个指针到起点,寻找环的入口
    slow = nums[0]
    while slow != fast:
        slow = nums[slow]
        fast = nums[fast]

    # 返回重复的数字
    return slow