题目:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。
链接:https://leetcode-cn.com/problems/find-the-duplicate-number
法一:自己的代码 不符合题意,用了额外的O(n)空间
思路:没有用字典进行记录每个元素的频率,用数组进行记录,将nums中的值作为memo的索引进行记录
from typing import List class Solution: def findDuplicate(self, nums: List[int]) -> int: n = len(nums) memo = [0] * (n+1) for i in nums: if memo[i] == 0: memo[i] += 1 else: return i
法二:快慢指针法 正确的解法
思路:先用两个指针遍历数组,由于快指针是慢指针的二倍,且由于环的存在,所以二者必定会相遇,相遇的时候一定在环内,因为环外的路径是单向的只会走一遍,再用一个指针从头开始遍历,与慢指针相遇的时候一定在入口处,即重复的节点上,此时返回该值,
from typing import List class Solution: def findDuplicate(self, nums: List[int]) -> int: slow=0 fast=0 while(1): slow=nums[slow] # 以上一行得到的slow为索引 fast=nums[nums[fast]] if(slow==fast): break find=0 while(1): find=nums[find] slow=nums[slow] if(find==slow): return find if __name__ == '__main__': solution = Solution() result = solution.findDuplicate([1,3,4,2,2]) print(result)
参考:https://leetcode-cn.com/problems/find-the-duplicate-number/solution/er-fen-fa-kuai-man-zhi-zhen-zhu-xing-jie-shi-pytho/