问题描述:给定一个包含 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