码迷,mamicode.com
首页 > 其他好文 > 详细

287. Find the Duplicate Number

时间:2018-11-23 22:54:07      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:info   静态链表   链表   style   while   开始   int   规则   list   

一、题目

  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

标签:info   静态链表   链表   style   while   开始   int   规则   list   

原文地址:https://www.cnblogs.com/skillking/p/10010051.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!