287. 寻找重复数(抽屉原理二分)

596 阅读1分钟

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