• 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
  • 相关阅读:
    常见三种字符编码的区别:ASCII、Unicode、UTF-8
    字节、字、bit、byte的关系
    SQLite 3 中的数据类型
    关于线程安全和可重入的区别
    线程安全与可重入
    c++中const变量定义与头文件包含的有关问题
    extern "C"的用法解析
    gVim for windows 简单使用教程
    函数对象
    Qt核心剖析:信息隐藏
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/14844663.html
Copyright © 2020-2023  润新知