题目:
一个长度为n的整数数组,里面的元素 大小范围在0~n-1之间,请判断是否有重复数字,若有请返回任意一个重复元素。
解法:
1、利用哈希表
2、不用哈希表,利用题目中数组的特性:大小范围在0~n-1之间
代码如下:(动态数组的哈希表)
bool duplicate(int numbers[], int length, int* duplication) {
duplication[0] = -1;
int *map= new int[length]() ;
for(int i = 0;i<length;i++)
{
map[numbers[i]]++;
if(map[numbers[i]]==2)
{
duplication[0] = numbers[i];
return true;
}
}
return false;
}
不用哈希表:不断调整数组使number[i]=i
bool duplicate(int numbers[], int length, int* duplication) {
if(length<1)
return false;
duplication[0] = -1;
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[0] = numbers[i];
return true;
}
else
swap(numbers[i],numbers[numbers[i]]);
}
}
return false;
}