1. 程式人生 > 其它 >LeetCode287尋找重複數-----二分法(抽屜原理)

LeetCode287尋找重複數-----二分法(抽屜原理)

題目表述

給定一個包含 n + 1 個整數的陣列 nums ,其數字都在 [1, n] 範圍內(包括 1 和 n),可知至少存在一個重複的整數。

假設 nums 只有 一個重複的整數 ,返回 這個重複的數 。

你設計的解決方案必須 不修改 陣列 nums 且只用常量級 O(1) 的額外空間。

二分法(抽屜原理)

抽屜原理:將10個水果放進9個抽屜裡,一定存在某個抽屜至少含有2個水果。
思路:陣列nums包含n+1個整數,數字範圍為[1,n],所以可以根據二分找中間的數mid,然後判斷陣列中有多少個小於mid的數,如果小於mid的數的數目大於mid,根據抽屜原理,則重複元素就在mid的左邊,否則重複的數在mid的右邊。

    public int findDuplicate(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            int cnt = 0;
            for(int num : nums){
                if(num <= mid){
                    cnt++;
                }
            }
            if(cnt > mid){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return left;
    }