此题的二分法与常规的二分法搜索不一样。平常我们用到二分法通常是对拍好序后的元素进行二分搜索,用来搜索数组中特定的元素。
该提中的二分则是对数组中元素与给定值之间的大小关系进行二分,首先取数组中最大和最小值的平均值作为mid值,然后统计整个数组中比mid小的数的数量,若数量>mid,这说明重复的数一定在left和mid这个区间内,否则就在mid+1和right这个区间。
class Solution {
public int findDuplicate(int[] nums) {
int left = 1;
int right = nums.length-1;
int mid;
while(left < right){
mid = (left + right) >>> 1;
int count = 0;
for(int i: nums){
if(i<=mid)count++;
}
if(count > mid){
right = mid;
}else{
left = mid+1;
}
}
return left;
}
}