首页 > 其他 > 详细

重复数字

时间:2015-01-24 10:04:35      阅读:277      评论:0      收藏:0      [点我收藏+]

一个元素个数为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 }

 

重复数字

原文:http://www.cnblogs.com/gallagher/p/4245420.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!