先用数组前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. 一文读懂卷积神经网络CNN(学习笔记)
  2. 海外web平台访问速度慢的原因之一
  3. 经典动态规划:0-1 背包问题
  4. 成都亿佰特物联网无线数传专家:lora无线传输模块网关技术的优缺点
  5. vsftp 简单教程
  6. 01-路由跳转 安装less this.$router.replace(path) 解决vue/cli3.0语法报错问题
  7. XCL-Charts圈图
  8. 简简单单汇率换算HTML代码
  9. 开源游戏服务器框架汇总
  10. 华为手机微信无法连接到服务器1-500,Wi-Fi 6 路由器买不起?华为新品路由 500 元不到就能买...
  11. unityshader 晶格化消散
  12. 游戏后台之高效定时器-时间轮
  13. 如何使用plsql连接远程数据库
  14. Pytorch模型训练和模型验证
  15. Nginx入门与实践
  16. playhome的php文件怎么导入,PlayHome导入XNALaraXPS模型教程 PlayHome工作室教程
  17. Centos安装ClamAV并且设置自动更新病毒库
  18. python列表嵌套合并成一个列表
  19. [自学第十一天] 静态项目实战_纽曼官网(用时三天)
  20. tomcat网站根目录在哪里_不会代码怎么自己搭建一个小说网站

热门文章

  1. Arduino控制土壤湿度传感器
  2. Linux磁盘分区以及多重引导简述
  3. 全局钩子+正则表达式=后台自动获取扫描枪数据
  4. Quia maxime eius ipsa.
  5. Fortran语言的入门与心得
  6. SuMa++论文阅读
  7. arduino控制寻迹传感器
  8. 28BYJ-48单极性步进电机
  9. excel php时间,excel时间函数
  10. pcb线路板制作过程分析