先用数组前k个元素维护一个大小为k的大顶堆(每次将元素插在最后,然后自底向上调整),从第k+1个数组元素开始,当数组元素小于堆顶时,取出堆顶,然后将这个元素放在堆顶,自顶向下调整。

最后取出k个数的时候,先取出堆顶,然后将最后一个元素放在堆顶,自顶向下调整。

取出来的时候是从大到小的,所以最后还要对数组进行逆序。

class Solution {public:static const int maxn=1000000;int f=200000000;int a[maxn];int nextp=1;vector<int>ans;void adjust(int idx){  //自底向上调整while(idx>1){if(a[idx]>a[idx/2]){swap(a[idx],a[idx/2]);idx=idx/2;}elsebreak;}}void insert(int num,int k){if(nextp-1<k){a[nextp]=num;adjust(nextp);            }nextp++;}void del(int num){  //替换堆顶,然后自顶向下调整a[1]=num;int cur=1;int left=cur*2;int right=cur*2+1;while(left<=nextp-1){int maxidx=left;if(right<=nextp-1&&a[left]<a[right])maxidx=right;if(a[cur]<a[maxidx]){swap(a[cur],a[maxidx]);cur=maxidx;left=cur*2;right=cur*2+1;}elsebreak;}}vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {if(k>input.size())return {};//fill(a,a+maxn,f);for(int i=0;i<k;i++){insert(input[i],k);}for(int i=k;i<input.size();i++){int top=a[1];if(input[i]<top){del(input[i]);}}for(int i=0;i<k;i++){ans.push_back(a[1]);int num=a[nextp-1];nextp--;del(num);}reverse(ans.begin(),ans.end());return ans;}
};

最小的k个数(堆排序实现)相关推荐

  1. java笔试题:海量数据找最大或最小的k个数(堆排序)

    题目 海量数据找最大或最小的k个数,这里以找最小的K个数为例 堆排序 例如给一个数组nums[]这棵树就是完全二叉树,则: nums[i]的左节点为:num[2 * i + 1] nums[i]的右节 ...

  2. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  3. 面试题整理10 最小的k个数

    <剑指offer>面试题30: 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 分析:求数组的第k小,如果能 ...

  4. 寻找数组中最小的k个数(快排和堆排)

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路1:利用快排的思想,寻找第k个位置上正确的数,k位置前面的数即 ...

  5. LeetCode:面试题40. 最小的k个数

    40. 最小的k个数 题目: 解题思路: 源码: 题目: 解题思路: 1.快速排序: 2.堆排序: 详细解释看leetcode的官网 源码: int comp(void *a,void *b){int ...

  6. 剑指offer_输入n个整数,找出其中最小的K个数

    最小的K个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 本题无非就是排序,取前K个值.但选什么排序算法呢? ...

  7. 【LeetCode】剑指 Offer 40. 最小的k个数

    [LeetCode]剑指 Offer 40. 最小的k个数 文章目录 [LeetCode]剑指 Offer 40. 最小的k个数 一.笨比解法 二.堆排序 三.快速选择 总结 一.笨比解法 选择排序变 ...

  8. 【力扣刷题】剑指 Offer 40. 最小的k个数(大顶堆)

    题目: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例: 输入:arr = [3,2,1], k = 2 ...

  9. 最小的k个数 java_【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思 ...

  10. 程序员编程艺术:第三章、寻找最小的k个数

    程序员编程艺术:第三章.寻找最小的k个数 作者:July. 时间:二零一一年四月二十八日. 致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作 ...

最新文章

  1. Android:AS与Unity3D之间打包的各种坑及解决方案
  2. BZOJ5329: [SDOI2018]战略游戏——题解
  3. 在 2016 年做 PHP 开发是一种什么样的体验?
  4. php 内容自动生成word文档,php生成word文档的例子
  5. 蓝叠 正在检查服务器最新,Windows update一直停留在正在检查更新
  6. 【转】带你玩转Visual Studio——04.带你高效开发
  7. thinkphp开发发卡网源码
  8. python三维圆曲面_python – matplotlib中的曲面和三维轮廓
  9. 一个有趣的IP不同的问题?
  10. Windows Phone(wp7)系统长按的秘密
  11. 接口设计考虑点及验证点
  12. 数据分析中会常犯哪些错误,如何解决? 一
  13. 一款保险系统架构设计图
  14. 用React实现基于Canvas的图片放大镜功能
  15. asp.net922-基于Web的房屋中介管理信息系统
  16. 使用python显示图像在windows图片查看器中一直显示加载中就是打不开的解决途径
  17. 时空图卷积网络ST-GCN论文完全解读记录
  18. 多人聊天功能代码php,PHP+swoole实现简单多人在线聊天群发效果
  19. 第一节课的Python基础知识
  20. 计算机9月21日二级试题,2016年9月计算机二级Access考前试题及答案

热门文章

  1. 被Facebook开除的中国工程师:我不后悔那天的决定
  2. 2016ACM/ICPC亚洲区大连站-补题
  3. 【Python3.6】生成微信好友个性签名词云
  4. 公司无线WIFI解决方案
  5. git diff使用简单记录
  6. 笔记:神经网络与深度学习—绪论
  7. 小红书文案怎么编辑制作?小红书上的文案怎么做的?
  8. my ReadTravel_Singapore / singapore / xinjiapo / lvyou / travel
  9. ac1900 linksys 恢复_AC1900路由器怎么恢复出厂设置?
  10. TTL肖特基触发器是什么?