题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
初步分析,就是用一个类似hash的结构计算,时间效率为n,空间效率为n。
bool duplicate(int numbers[], int length, int* duplication) {
int *tmp = new int[length + 1];
for (int i = 0; i < length; i++)
{
tmp[i] = 0;
}
for (int i = 0; i < length; i++)
{
tmp[numbers[i]]++;
if (tmp[numbers[i]] > 1)
{
*duplication = numbers[i];
return true;
break;
}
}
return false;
}
test.cpp
void start_test()
{
Solution s;
int a[] = { 2, 3, 1, 0, 2, 5, 3 };
int *p = new int;
s.duplicate(a, 7, p);
int c = 0;
}
二、优化
应该还有效率时间效率为n,空间效率为1的算法存在
可以采取交换位置的方法
例如:
int a[] = {2,3,1,0,2,5,3} ;
len = 7;
那么遍历数组
2 和 1交换位置,
判断 1是否在合适位置,
在i++
不在上交换 1 和 3
不在交换3 和 0
0 在合适位置,i++
依次类推
当 合适位置上的数值等于 i位置上的数值时,该值重复