題意:有一個n+1個數的數組,每個數都小於等於n,有一個數重複了至少一次,找出這個數,要求空間複雜度O(1),且不能更改原數組
思路:根據數組裏的數而不是索引二分,即二分答案,找出數組中某個數的出現次數,如果次數大於這個數,那答案就在這個數前面,否則就在後面
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 i = 0; i < nums.length; i++) {
if (nums[i] <= mid)
cnt++;
}
if (cnt > mid)
r = mid;
else
l = mid + 1;
}
return l;
}
}