zoukankan      html  css  js  c++  java
  • leetcode 287 寻找重复数

    简介

    因为对于时间和空间有一定的要求, 所以, 不能用暴力哦.

    大佬的思路

    简单来说, 快慢指针第一次相遇不在环的入口处.
    第二次相遇, 在环的入口处.

    low = fast 时,快慢指针相遇,low 走过的距离是初始点(0)到环状开始的点 (x) 加上 环状开始的点(x) 到相遇点(y) 这段距离,而fast走过的距离是 初始点(0)到环状开始的点(x),点(x) 到点(y),点(y)到点(x),点(x)到点(y)。又因为fast走过的距离是low的两倍,设0到x长度为a,x到y长度为b,则有2*(a+b) = a+ b+ (y到x的距离) + b,则y到x的距离就等于0到x的距离。所以当新的两个指针 一个从0出发,一个从相遇点y出发时,他们走到的相同的值就是环状开始的点,即x点。

    code

    class Solution {
        public int findDuplicate(int[] nums) {
            int slow = 0; 
            int fast = 0;
            slow = nums[slow];
            fast = nums[nums[fast]];
            while(slow != fast){
                slow = nums[slow];
                fast = nums[nums[fast]];
            }
            int pre1 = 0;
            int pre2 = slow;
            while(pre1 != pre2){
                pre1 = nums[pre1];
                pre2 = nums[pre2];
            }
            return pre1;
        }
    }
    
    Hope is a good thing,maybe the best of things,and no good thing ever dies.----------- Andy Dufresne
  • 相关阅读:
    公共服务领域英文译写规范
    [.NET Core]
    [WebAPI]
    [C#]
    [ES]
    [.Net Core]
    [SourceTree]
    如何使用一个库中不存在的函数
    在使用masm32 rc编译资源文件.rc出现的问题
    MSDN 2005 安装问题
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/14844663.html
Copyright © 2011-2022 走看看