首页 > 代码库 > 重复数字

重复数字

一个元素个数为m的数组,保存了[0,n)之间的数字。已知m≥n,那么数组中必然有重复的数字。求出之中的重复数字。

遍历数组:

对arr[i],可知它正确的位置应该在arr[i]上。

如果arr[i] == i,表明该值已经处于正确的位置,++i。

如果arr[i] != i,如果arr[arr[i]]与arr[i]相同,表明arr[i]是多余的值,打印该值,++i;否则,交换二者,再次检查该位置。

 1 // 令m = arr.size(), 且m >= n. 2 // arr中保存着[0, n)的数字, 由于m >= n, 之中必然有重复的. 3 // 输出他们. 4 void PrintDuplicateNumbers(vector<int>& arr, int n)  { 5     for (int i = 0; i < arr.size(); ++i) { 6         int current = arr[i]; 7         if(current == i) 8             continue; 9 10         // 希望交换的位置上的值与自身相同, 表明自身是多余值.11         if (arr[current] == current) {12             cout << arr[current] << " ";13             continue;14         }15 16         swap(arr[current], arr[i]);17 18         // [0, i)之间的值, 或者处于正确的位置, 或者它正确的位置被其他相同的值占领.19         // 如果current < i, 表明是向前的一次交换, 且交换的一定是上述第二种情况的20         // 值. 而该值已经是多余的, 因此无需再继续检查该位置.21         if (current > i)22             --i;23     }24 }

 

重复数字