
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;
}
}