LeetCode 287 题解

https://leetcode.com/problems/find-the-duplicate-number/description/

题目大意:n+1个数,有1个数字重复了多次,找出来。要求不能用额外的空间,不能改变数组内容。

解题思路:第一想法是排序,但是这要么要改变数组内容,要么需要额外的空间。

考虑如下的一个序列:

idx 0 1 2 3 4
val 1 3 4 2 2

从idx=0开始,对应的val是下一个idx,建立一个类似链表的结构, 1->3->2->4->2 将会出现一个环,之后就是链表判环的解法,可以用快慢指针来做。环的入口就是重复的数字。

下面简单分析一下,因为现在肯定存在重复的数字,假设重复的数字的个数有两个,分别对应的idx为x,y ,那么肯定存在一个值为x的 和 nusm[x] 相连,也肯定存在一个值为y的 和 nums[y]相连,  这个nums[x]==nums[y]就是重复数字,也是环的入口。

class Solution {
    public int findDuplicate(int[] nums) {
        int slow=nums[0],fast=nums[0];
        do
        {
            slow = nums[slow];
            fast = nums[fast];
            fast = nums[fast];
//            System.out.println(slow+" "+fast);
        }while(fast!=slow);

        fast =nums[0];
        while(fast!=slow)
        {
            fast = nums[fast];
            slow = nums[slow];
//            System.out.println(slow+" "+fast);
        }
        return fast;
    }
}


猜你喜欢

转载自blog.csdn.net/u011439455/article/details/80454516