Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244787
  • 博文数量: 62
  • 博客积分: 973
  • 博客等级: 准尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-16 23:25
文章分类

全部博文(62)

文章存档

2013年(1)

2012年(14)

2011年(47)

分类: C/C++

2011-12-02 20:59:29

题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。

/* 如果待插入的值比当前已有的最大值小,则用这个数替换替换当前已有的最大值;
*  如果带插入的值比当前已有的最大值还要大,那么这个数不可能是最小的k个整数之一,
*  因为我们容器内已经有k个数字比它小了,于是我们可以抛弃这个整数。
*/
  1. #include <set>
  2. #include <vector>
  3. #include <iostream>

  4. using namespace std;

  5. typedef multiset<int, greater<int> > IntHeap;

  6. void findKLeastNumbers( const vector<int>& data,
  7.                         IntHeap& leastNumbers, // output
  8.                         unsigned int k )
  9. {
  10.     leastNumbers.clear();
  11.     
  12.     if(0 == k || data.size() < k)
  13.         return;
  14.     
  15.     vector<int>::const_iterator iter = data.begin();
  16.     for(; iter != data.end(); ++iter)
  17.     {
  18.         // less than k numbers was inserted into leastNumbers
  19.         if(leastNumbers.size() < k)
  20.             leastNumbers.insert(*iter);
  21.         else
  22.         {
  23.             // first number in leastNumbers is the greatest one
  24.             IntHeap::iterator iterFirst = leastNumbers.begin();
  25.             
  26.             // if is less than the previous greatest
  27.             if( *iter < *(leastNumbers.begin()) )
  28.             {
  29.                 //replace the previous greatest number
  30.                 leastNumbers.erase(iterFirst);
  31.                 leastNumbers.insert(*iter);
  32.             }
  33.         }
  34.     }
  35. }
// www.cnblogs.com/aLittleBitCool/archive/2011/01/18/1938733.html
// www.cnblogs.com/mingzi/archive/2009/08/04/1538448.html
阅读(1664) | 评论(0) | 转发(0) |
0

上一篇:分解质因数

下一篇:自旋锁与信号量

给主人留下些什么吧!~~