实现算法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;
}
查找重复数字算法
本文介绍两种查找数组中重复数字的方法:一种通过修改原始数组降低空间复杂度至O(1),另一种采用二分查找思想确定重复数字,适用于长度为n且元素范围在0到n-1之间的整数数组。
1266

被折叠的 条评论
为什么被折叠?



