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.
题目分析:找到重复数,复杂度小于o(n2),很容易想到用二分法查找。
具体代码如下:
public int findDuplicate(int[] nums) {
int len=nums.length;
int low=1;
int high=len-1;
//在low=high终止
while(low<high)
{
int mid=(low+high)/2;
/**相当于找到low和mid之间的数,包括mid*/
int n=count(low,mid,len,nums);
/**如果有重复的,则相关的值大于等于mid-low+1,因为值中包括mid在内*/
if(n>(high-low)/2+1)
{
high=mid;
}
else
{
low=mid+1;
}
}
return low;
}
public int count(int a,int b,int len,int[] nums)
{
int sum=0;
for(int i=0;i<len;i++)
{
if(nums[i]<=b&&nums[i]>=a)
sum++;
}
return sum;
}