题目描述
AC代码
/*
解题根据:抽屉原理
时间复杂度:O(nlogn),二分->logn 遍历->n n*logn=nlogn
*/
class Solution {
public int findDuplicate(int[] nums) {
int l=1,r=nums.length-1;
while(l<r){
int mid=l+r>>1;
//苹果的个数
int cnt=0;
for(int x:nums)
if(x>=l&&x<=mid)
cnt++;
//mid-l+1可以看作是抽屉的个数
if(cnt>(mid-l+1))
//满足则说明l~mid区间中有重复的数字
r=mid;
else
//不满足则说明l~mid区间没有重复的,需要到mid+1~r区间查看是否有重复的数字
l=mid+1;
}
return r;
}
}