剑指offer:数组中重复的数字1
1.题目描述
2.解题思路
解题思路全部来源于《剑指offer》,在代码部分,书本中往往提供的是思路相对较优的代码,但是其他思路的实践也是很有意义的,因此将几种思路的代码在这里进行汇总。
思路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;
}
sort(numbers,numbers+length-1);//对数组进行从小到大排序
for(int i=0;i<length-1;i++){
if(numbers[i]==numbers[i+1]){
*duplication=numbers[i];
return true;
}
}
return false;
}
思路2: 利用哈希表进行判断。哈希表中不曾出现的数就添加进去,哈希表中存在的数即为重复的数。
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;
}
hash_map<int,int> hmap;
for(int i=0;i<length;i++){
if(hmap.find(numbers[i])==hmap.end())
hmap.insert(pair<int,int>(numbers[i],numbers[i]));
else
{
*duplication=numbers[i];
return true;
}
}
return false;
}
注意头文件:
#include<hash_map>
using __gnu_cxx::hash_map;
思路3: 书本提供代码的思路,根据下标定位对应的思路。详细思路不再赘述。
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;
}
else{
int temp=numbers[i];
numbers[i]=numbers[temp];
numbers[temp]=temp;
}
}
}
return false;
}