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
题目大意:
n+1个数字由连续的1-n组成,找出其中重复的那一个数字。
要求:
1.不能改动数组 则不能对数组进行排序
2.常量空间复杂度
3.时间复杂度小于O(n^2)
4.仅仅只有一个重复的数字且最多重复一次。
AC代码:
public int findDuplicate(int[] nums) {
int n = nums.length-1;
int low = 1, high= n;
int mid = 0;
while(low<high) {
mid = low + (high-low)/2;
int c= count(nums, mid); //count #numbers less than mid.
if(c<=mid) {
low = mid+1;
} else {
high = mid;
}
}
return low;
}
private int count(int[] nums, int mid) {
int c =0;
for(int i=0; i<nums.length; i++) {
if(nums[i]<=mid) c++;
}
return c;
}
int n = nums.length-1;
int low = 1, high= n;
int mid = 0;
while(low<high) {
mid = low + (high-low)/2;
int c= count(nums, mid); //count #numbers less than mid.
if(c<=mid) {
low = mid+1;
} else {
high = mid;
}
}
return low;
}
private int count(int[] nums, int mid) {
int c =0;
for(int i=0; i<nums.length; i++) {
if(nums[i]<=mid) c++;
}
return c;
}