码迷,mamicode.com
首页 > 其他好文 > 详细

287寻找重复数

时间:2020-02-28 18:46:36      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:额外   ping   整数   none   fas   开始   view   event   快慢指针   

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

287寻找重复数

标签:额外   ping   整数   none   fas   开始   view   event   快慢指针   

原文地址:https://www.cnblogs.com/xxswkl/p/12378420.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!