Problem
在长度为n的数组里的所有数字都在 0 ~ n−1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
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)的时间复杂度。

268

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



