287. Find the Duplicate Number

// 若是[1,n]的數字都只有一個,那麼咱們會造成一個閉合的環。
idx 1 2 3 4
val 3 1 4 2
1->3->4->2 這樣就是一個閉合的環。

若是有重複數字出現的話,以下:
idx 1 2 3 4 5
val 2 4 2 3 1
1->2->4->3->2->4   這裏就有一個2->4->3->2的環, 2就是重複數字

public class Solution {
    public int findDuplicate(int[] nums) {
        int slow = nums[0];
        int fast = nums[nums[0]];
        
        while(slow != fast){
            slow = nums[slow];
            fast = nums[nums[fast]];
        }
        
        fast = 0;
        while(slow != fast){
            slow = nums[slow];
            fast = nums[fast];
        }
        
        return fast;
    }
}
若是1到mid每一個數字都只出現一次,在nums裏<=mid的個數應該就是mid.
個數大於mid的話,前面的數字裏就會有重複。

public class Solution {
    public int findDuplicate(int[] nums) {
        int n = nums.length-1, lo = 1, hi = n;
        while(lo < hi){
            int mid = lo + (hi-lo)/2, count = 0;
            for(int n: nums)
                if(n <= mid) count++;
            if(count > mid) hi = mid;
            else low = mid+1;
        }
        return lo;
    }
}
相關文章
相關標籤/搜索