Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
Note:
- You must not modify the array (assume the array is read only).
- You must use only constant, O(1) extra space.
- Your runtime complexity should be less than
O(n2)
. - There is only one duplicate number in the array, but it could be repeated more than once.
这里有个条件,就是数组中的数的范围是[1,n];
我们可以尝试用二分法,第一次取(1+n)/2,如果在整个数组中小于等于(1+n)/2的数的个数超过了(1+n)/2,那么重复的数一定是[1,(1+n)/2)区间的数。
class Solution { public: int findDuplicate(vector<int>& nums) { int numsSize = nums.size(); int low = 0,high = numsSize; while(low<high){ int mid = low+(high-low)/2; int cnt = 0; for(int i=0;i<numsSize;i++){ if(nums[i] <= mid){ cnt++; } } if(cnt > mid){ high = mid; }else{ low = mid+1; } } return low; } };