博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指Offer——最小的K个数
阅读量:5112 次
发布时间:2019-06-13

本文共 1543 字,大约阅读时间需要 5 分钟。

题目描述:

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

分析:

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

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

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

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

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

代码:

1 class Solution { 2 public: 3     vector
GetLeastNumbers_Solution(vector
input, int k) { 4 int iSize = input.size(); 5 if(k == iSize) return input; 6 vector
leastNumbers; 7 if(k <= 0 || k > iSize) return leastNumbers; 8 leastNumbers.push_back(0); // 使下标为0的位置为0,不使用该位置,便于访问后面的元素 9 for(int i = 0; i < k; i++) { // 初始化一个k大小的堆10 leastNumbers.push_back(input[i]);11 }12 for(int i = k / 2; i > 0; --i) {13 HeapAdjust(leastNumbers, i, k); // 调整为大根堆14 }15 for(int i = k; i < iSize; i++) {16 if(input[i] < leastNumbers[1]) {17 leastNumbers[1] = input[i];18 HeapAdjust(leastNumbers, 1, k); // 调整为大根堆19 }20 }21 leastNumbers.erase(leastNumbers.begin()); // 移除第0位置的022 return leastNumbers;23 }24 25 void HeapAdjust(vector
&input, int s, int m) { // 调整堆26 int rc = input[s];27 for(int j = (s << 1); j <= m; j <<= 1) {28 if(j < m && input[j] < input[j + 1]) ++j;29 if(rc > input[j]) break;30 input[s] = input[j];31 s = j;32 }33 input[s] = rc;34 }35 };

 

转载于:https://www.cnblogs.com/jacen789/p/7747656.html

你可能感兴趣的文章
jquery笔记
查看>>
Andorid:日常学习笔记(3)——掌握日志工具的使用
查看>>
【Spring Boot学习之一】Spring Boot简介
查看>>
个人中心标签页导航
查看>>
HTML5应用盈利难,解决5大难题是关键
查看>>
HTML5设备能否改变企业应用开发?
查看>>
单反快门检测软件
查看>>
python静态方法和类方法
查看>>
模拟登录
查看>>
简单的CRUD(二)
查看>>
Spring MVC 跳转失败,但配置正确填坑
查看>>
UDP通信后端缓冲区 List<T>
查看>>
c++/c关于函数指针
查看>>
贝叶斯分析基本概念
查看>>
判断单链表是否存在环及寻找环的入口点
查看>>
Windows密码本地破解通用方法
查看>>
App研发录得源码
查看>>
Nodejs sublime text 3安装与配置
查看>>
《转》Python学习(18)-python函数(二)
查看>>
awk应用场景之过滤举例
查看>>