Problem
在长度为n的数组里的所有数字都在
0
~
Solution
Solution 1
使用一个相同长度的数组,做哈希表。Solution 2
如果第i个数字不是i,那么和第numbers[i]个数字做比较,如果不一样,就交换位置i和位置numbers[i]。
每个数字最多交换两次到正确位置,故时间复杂度为 O(n) 。
bool duplicate(int numbers[], int length, int* duplication) {
for(int i = 0; i < length; i++) {
while (numbers[i] != i) {
if (numbers[i] == numbers[numbers[i]]) {
*duplication = numbers[i];
return true;
}
int temp = numbers[i];
numbers[i] = numbers[temp];
numbers[temp] = temp;
}
}
return false;
}
- Solution 3
按大小进行分割统计个数,如果在区间的数字个数超过区间长度,说明重复数字存在在区间中。时间复杂度 O(nlogn) 。