问题描述:
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(1),也就不能使用计数。不过有一点是,这里面的上下界分别给定了,分别是1,n,所以可以使用猜的方法(二分查找)。
代码如下:
public class Solution {
public int findDuplicate(int[] nums) {
//二分查找
int length = nums.length;
int left = 1;
int right = length-1;
while(left<right){
int mid = (left+right)/2;
int count = 0;
int base = 0;
for(int i = 0;i<length;i++){
if(nums[i]<mid)
count++;
else if(nums[i]==mid)
base++;
}
if(base>1)
return mid;
else if(count+base>mid)
right = mid-1;
else
left = mid+1;
}
return left;
}
}