标签:temp 相等 长度 输入 它的 amp start count 描述
一、问题描述: 找出数组中重复的数字
在一个长度为n的数组里的所有数字都在0~n-1的范围内,数组中某些数字是重复的,但不知道有几个数字重复,也不知道重复了几次。请找出数组中任意一个重复的数字。
bool duplicate(int numbers[], int length, int* duplication){
if(numbers == nullptr || length < 0)
return false;
for(int i=0; i < length; i++){
if(numbers[i]<0 || numbers[i]>length-1)
return false;
}
for(int i=0; i < length; i++){
while(numbers[i] != i){
if(numbers[i] == numbers[numbers[i]]){
*duplication = numbers[i];
return true;
}
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
}
}
return false;
}
二、问题描述: 不修改数组找出重复的数字
在一个长度为n+1的数组里的所有数字都在1-n的范围内,所以数组中至少有一个数字是重复的。请找出数组里任意一个重复的数字,但不能修改数组
int countRange(const int* numbers, int length, int start, int end){
if(numbers == nullptr)
return 0;
int count = 0;
for(int i=0; i < length; i++){
if(numbers[i]>=start && numbers[i]<=end){
++count;
}
}
return count;
}
int getDuplication(const int* numbers, int length){
if(numbers==nullptr || length<=0)
return -1;
int start = 1;
int end = length-1;
while(end >= start){
int middle = (end-start)>>2 + 1;
int count = countRange(numbers, length, start, middle);
if(end == start){
if(count > 1)
return start;
else
break;
}
if(count > (middle-start+1))
end = middle;
else
start = middle+1;
}
return -1;
}
按照二分查找的思路,如果输入长度为n的数组,那么函数countRange()将被调用O(logn)次,每次需要O(n)的时间,因此总的时间复杂度是O(nlogn),空间复杂度为O(1).
标签:temp 相等 长度 输入 它的 amp start count 描述
原文地址:https://www.cnblogs.com/CodingML-1122/p/9189911.html