题目描述:

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。

分析:

建一个K大小的大根堆,存储最小的k个数字。

先将K个数进堆,然后调整堆为大根堆。

之后每加一个数,就和堆的根结点比较。

如果大于堆的根结点,则忽略。否则,替换根结点的值,然后调整堆。

最后,剩下的就是其中最小的K个数。

代码:

 class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
int iSize = input.size();
if(k == iSize) return input;
vector<int> leastNumbers;
if(k <= || k > iSize) return leastNumbers;
leastNumbers.push_back(); // 使下标为0的位置为0,不使用该位置,便于访问后面的元素
for(int i = ; i < k; i++) { // 初始化一个k大小的堆
leastNumbers.push_back(input[i]);
}
for(int i = k / ; i > ; --i) {
HeapAdjust(leastNumbers, i, k); // 调整为大根堆
}
for(int i = k; i < iSize; i++) {
if(input[i] < leastNumbers[]) {
leastNumbers[] = input[i];
HeapAdjust(leastNumbers, , k); // 调整为大根堆
}
}
leastNumbers.erase(leastNumbers.begin()); // 移除第0位置的0
return leastNumbers;
} void HeapAdjust(vector<int> &input, int s, int m) { // 调整堆
int rc = input[s];
for(int j = (s << ); j <= m; j <<= ) {
if(j < m && input[j] < input[j + ]) ++j;
if(rc > input[j]) break;
input[s] = input[j];
s = j;
}
input[s] = rc;
}
};

最新文章

  1. Oracle数据库根据时间查询
  2. win7 下加载MSCOMCTL.OCX
  3. 利用Scala语言开发Spark应用程序
  4. Java中native关键字
  5. atitit.ajax bp dwr 3.的注解方式配置使用流程总结.....
  6. ubuntu网络配置
  7. ManagementFactory cannot be resolved
  8. php调用微信发送自定义模版接口
  9. 【Xamarin挖墙脚系列:Xamarin.IOS的程序的结构】
  10. s标签可以if elseif else
  11. [Twisted] 事件驱动模型
  12. 如何在不影响数据库的正常使用的情况下得到数据的完整.mdf和.ldf文
  13. App Store不能下载一直等待中的两种解决办法
  14. webpack基础入门
  15. 求数组的最小数、最大值,求一组数的平均数,sort函数详解,类数组转数组
  16. Bootstrap+Vue.js 练习入门一
  17. 关于Asp.net事件,如何在触发子控件的事件时,同步触发父页面的事件
  18. Linux实践:模块
  19. Scala--集合
  20. Python爬虫:如何爬取分页数据?

热门文章

  1. cf 450c Jzzhu and Chocolate
  2. Spring AOP注解通过@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入属性的配置文件详解
  3. C语言 &#183; 大数加法
  4. JAVA数据库连接池的革命 -- 从BoneCP到HikariCP
  5. LAMP 环境搭建关键步骤及注意事项
  6. 翻译:Laravel-4-Generators 使用自己定义代码生成工具高速进行Laravel开发
  7. HIbernate與不支持boolean的數據庫之間的映射
  8. 树形dp - BNU 39572 Usoperanto
  9. 燕十八mysql笔记
  10. stringstream类操作字符串流