287. Find the Duplicate Number

1、題目數組

  一、審題spa

  

  

  二、分析指針

    一個長度爲 n+1 的整形數組,元素值爲 1~ n 之間。其中一個元素重複了屢次,其餘元素只出現一次。求出屢次出現的那個元素。code

 

2、解答blog

  一、思路索引

    相似: 142. Linked List Cycle II 同步

    //這道題的關鍵在於0處是沒有索引指向的,將數組視爲靜態鏈表,從0處開始的鏈必定不會指回0處,
    //即該鏈必定有節點被指向兩次。而這個節點就是要返回的節點(即重複的值)。
    //由於只有一個重複數字,其餘鏈上的狀況沒必要考慮。
    //經過相似跑步的規則,讓兩個「指針」,異速跑,當二者第一次相遇時,必定在環上。
    //此時若通過了n次迭代,環的長度則爲n;假設環外的長度爲m,此時從相遇點到入環點也差m步;(能夠本身畫圖)
    //因此重置一個指針,走相同步數直到相遇,相遇點即爲入環點;ast

    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;
    }
相關文章
相關標籤/搜索