题目:在一个长度为n+1的数组里的所有数字都在1到n的范围内。所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为7的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3。
思路:数组中的数都在1 ~ n范围内,把从1 ~ n的数从中间的数字m分为2部分,左部分为1 ~ m,右部分为m+1 ~ n,如果1 ~ m这m个数在数组中的总个数超过m,则这一半的区间里一定包含重复的数;否则,另一半区间里一定包含重复的数。继续把包含重复的数的区间一分为二,知道找到一个重复的数。
int duplicate(const int *arr,int n){
if(arr == nullptr || n <= 0)
return -1;
int start = 1;
int end = n-1;
while(start<=end){
int mid = ((end-start)>>1) + start;
int count = countRange(arr,n,start,mid);
if(start == end){
if(count >1)//这里要大于1
return start;
else
break;
}
if(count > (mid-start+1) )
end = mid;
else
start = mid+1;
}
return -1;
}
int countRange(const int *arr,int length,int start,int end){
if(arr == nullptr)
return 0;
if(length < 0 || (start > end))
return 0;
int count = 0;
for(int i=0;i<length;i++)
if(arr[i]>=start && arr[i]<=end)
count++;
return count;
}