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)。
本文介绍了一种在长度为n的数组中寻找重复数字的方法。数组中的数字范围在0到n-1之间,通过三种不同解决方案详细阐述了如何高效地找到重复的数字。Solution1采用哈希表方式;Solution2利用原地交换思想实现O(n)的时间复杂度;Solution3则通过分割统计个数的方式达到O(nlogn)的时间复杂度。
681

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



