实现算法1
- 修改了原始数组
- 空间复杂度为O(1)
bool duplicate(int numbers[],int length){
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]]) {
cout<<numbers[i]<<endl;//重复的数字
return true;
}
int temp=numbers[i];
numbers[i]=numbers[temp];
numbers[temp]=temp;
}
}
return false;
}
实现算法2
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)>>1)+start;
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;
}
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;
}