使用二分法,每次统计分界点两边的数据数量,根据抽屉原理,哪边放的东西大于了抽屉的数量就会产生重复,因此搜索空间减半。
class Solution {
public:
int duplicateInArray(vector<int>& nums) {
int l = 1, r = nums.size() - 1;
while(l < r){
int mid = (l + r) >> 1;
int s = 0;
for(auto x : nums) s += x >= l && x <= mid;
if(s > mid - l + 1) r = mid;
else l = mid + 1;
}
return l;
}
};