技巧----5.寻找重复数

287. 寻找重复数 - 力扣(LeetCode)

/**

        结论:

            例[1,3,4,2,2]

            nums[0]、nums[nums[0]]、nums[nums[nums[0]]]、nums[nums[nums[nums[0]]]]、nums[nums[nums[nums[nums[0]]]]]

            将这几个元素一次串起来形成一个链表: 1-->3-->2-->4-->2-->4-->2.....,该链表会存在一个环,环的入口即为重复的元素

        环形链表的入口:

            快指针两步/次 慢指针一步/次 相对速度为1 快指针必然和慢指针相遇,不会跳过慢指针

            当快慢指针在环内相遇时,再从起点出发一个慢指针,两慢指针相遇点必然是环入口点    

*/

class Solution {
    /**
        结论:
            例[1,3,4,2,2]
            nums[0]、nums[nums[0]]、nums[nums[nums[0]]]、nums[nums[nums[nums[0]]]]、nums[nums[nums[nums[nums[0]]]]]
            将这几个元素一次串起来形成一个链表: 1-->3-->2-->4-->2-->4-->2.....,该链表会存在一个环,环的入口即为重复的元素
        环形链表的入口:
            快指针两步/次 慢指针一步/次 相对速度为1 快指针必然和慢指针相遇,不会跳过慢指针
            当快慢指针在环内相遇时,再从起点出发一个慢指针,两慢指针相遇点必然是环入口点    
    */
    public int findDuplicate(int[] nums) {
        int slow = 0, fast = 0;
        while(true) {
            slow = nums[slow];
            fast = nums[nums[fast]];

            if(slow == fast) {
                break;
            }
        }

        int slow2 = 0;
        while(true) {
            slow = nums[slow];
            slow2 = nums[slow2];

            if(slow == slow2) {
                return slow;
            }
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值