zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    多项式全家桶学习笔记
    [题解] Luogu P2000 拯救世界
    [题解] LuoguP4389 付公主的背包
    [题解] CF438E The Child and Binary Tree
    拉格朗日插值法
    bzoj2788: [Poi2012]Festival
    暑假集训test-8-29
    luoguP4768 [NOI2018]归程
    HDU6331Problem M. Walking Plan
    暑假集训test-8-28
  • 原文地址:https://www.cnblogs.com/skillking/p/10010051.html
Copyright © 2011-2022 走看看