一个元素个数为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 }
时间: 2024-11-05 13:43:29