leetcode-287. 寻找重复数-数组构成的链表

287. 寻找重复数

  • 由题中数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

  • 维护一个映射关系f(n)= index -> num,其中数组的下标index,数字为num

当一个数组里有环的时候,例如

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

映射为:

0 -> 1   0 -> 3

1 -> 3   1 -> 1

2 -> 4   2 -> 3

3 -> 2   3 -> 4

4 -> 2   4 -> 2

得链表:

我们得到入环点的数 = 重复的数

这道题就变成了快慢指针找入环点的题,只是快慢指针表示不同

public int findDuplicate(int[] nums) {
        int slow = 0;//slow指针从0开始
        int fast = 0;//fast指针从0开始
        slow = nums[slow]; //慢指针一次走一步
        fast = nums[nums[fast]];  //快指针一次走两步
        while(slow != fast){ //当快慢指针相遇的时候得到结果,如果没相遇则一直循环
            //有题目可知这个数组里绝对有一个重复的,所以必定成环
            slow = nums[slow]; //慢指针一次走一步
            fast = nums[nums[fast]]; //快指针一次走两步
        }
        fast = 0; //让快指针回到开头
        while(slow != fast){ //当快慢指针相遇的时候得到结果,没相遇则一直循环
            slow = nums[slow]; //慢指针一次走一步
            fast = nums[fast]; //快指针一次走两步
        }
        return slow; //最终相遇返回slow就是成环的点
    }

 

posted on 2022-10-10 17:37  老菜农  阅读(13)  评论(0编辑  收藏  举报

导航