287. Find the Duplicate Number

Posted skillking

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了287. Find the Duplicate Number相关的知识,希望对你有一定的参考价值。

一、题目

  1、审题

  技术分享图片

  

  2、分析

    一个长度为 n+1 的整形数组,元素值为 1~ n 之间。其中一个元素重复了多次,其他元素只出现一次。求出多次出现的那个元素。

 

二、解答

  1、思路

    类似: 142. Linked List Cycle II 

    //这道题的关键在于0处是没有索引指向的,将数组视为静态链表,从0处开始的链一定不会指回0处,
    //即该链一定有节点被指向两次。而这个节点就是要返回的节点(即重复的值)。
    //因为只有一个重复数字,其他链上的情况不必考虑。
    //通过类似跑步的规则,让两个“指针”,异速跑,当两者第一次相遇时,一定在环上。
    //此时若经过了n次迭代,环的长度则为n;假设环外的长度为m,此时从相遇点到入环点也差m步;(可以自己画图)
    //所以重置一个指针,走相同步数直到相遇,相遇点即为入环点;

    public int findDuplicate(int[] nums) {
        if(nums.length > 1) {
            int slow = nums[0];
            int fast = nums[nums[0]];
            while(slow != fast) {
                slow = nums[slow];
                fast = nums[nums[fast]];
            }
            
            fast = 0;
            while(fast != slow) {
                fast = nums[fast];
                slow = nums[slow];
            }
            return slow;
        }
        return -1;
    }

 






以上是关于287. Find the Duplicate Number的主要内容,如果未能解决你的问题,请参考以下文章

287. Find the Duplicate Number

287. Find the Duplicate Number

287. Find the Duplicate Number

287. Find the Duplicate Number

287. Find the Duplicate Number

287. Find the Duplicate Number