287寻找重复数

题目:给定一个包含 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
View Code

法二:快慢指针法   正确的解法

思路:先用两个指针遍历数组,由于快指针是慢指针的二倍,且由于环的存在,所以二者必定会相遇,相遇的时候一定在环内,因为环外的路径是单向的只会走一遍,再用一个指针从头开始遍历,与慢指针相遇的时候一定在入口处,即重复的节点上,此时返回该值,

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)
View Code

参考:https://leetcode-cn.com/problems/find-the-duplicate-number/solution/er-fen-fa-kuai-man-zhi-zhen-zhu-xing-jie-shi-pytho/

猜你喜欢

转载自www.cnblogs.com/xxswkl/p/12378420.html