最小的k个数(堆排序实现)
先用数组前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个数(堆排序实现)相关推荐
- java笔试题:海量数据找最大或最小的k个数(堆排序)
题目 海量数据找最大或最小的k个数,这里以找最小的K个数为例 堆排序 例如给一个数组nums[]这棵树就是完全二叉树,则: nums[i]的左节点为:num[2 * i + 1] nums[i]的右节 ...
- 【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...
- 面试题整理10 最小的k个数
<剑指offer>面试题30: 题目:输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 分析:求数组的第k小,如果能 ...
- 寻找数组中最小的k个数(快排和堆排)
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路1:利用快排的思想,寻找第k个位置上正确的数,k位置前面的数即 ...
- LeetCode:面试题40. 最小的k个数
40. 最小的k个数 题目: 解题思路: 源码: 题目: 解题思路: 1.快速排序: 2.堆排序: 详细解释看leetcode的官网 源码: int comp(void *a,void *b){int ...
- 剑指offer_输入n个整数,找出其中最小的K个数
最小的K个数 题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 本题无非就是排序,取前K个值.但选什么排序算法呢? ...
- 【LeetCode】剑指 Offer 40. 最小的k个数
[LeetCode]剑指 Offer 40. 最小的k个数 文章目录 [LeetCode]剑指 Offer 40. 最小的k个数 一.笨比解法 二.堆排序 三.快速选择 总结 一.笨比解法 选择排序变 ...
- 【力扣刷题】剑指 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 ...
- 最小的k个数 java_【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思 ...
- 程序员编程艺术:第三章、寻找最小的k个数
程序员编程艺术:第三章.寻找最小的k个数 作者:July. 时间:二零一一年四月二十八日. 致谢:litaoye, strugglever,yansha,luuillu,Sorehead,及狂想曲创作 ...
最新文章
- 一文读懂卷积神经网络CNN(学习笔记)
- 海外web平台访问速度慢的原因之一
- 经典动态规划:0-1 背包问题
- 成都亿佰特物联网无线数传专家:lora无线传输模块网关技术的优缺点
- vsftp 简单教程
- 01-路由跳转 安装less this.$router.replace(path) 解决vue/cli3.0语法报错问题
- XCL-Charts圈图
- 简简单单汇率换算HTML代码
- 开源游戏服务器框架汇总
- 华为手机微信无法连接到服务器1-500,Wi-Fi 6 路由器买不起?华为新品路由 500 元不到就能买...
- unityshader 晶格化消散
- 游戏后台之高效定时器-时间轮
- 如何使用plsql连接远程数据库
- Pytorch模型训练和模型验证
- Nginx入门与实践
- playhome的php文件怎么导入,PlayHome导入XNALaraXPS模型教程 PlayHome工作室教程
- Centos安装ClamAV并且设置自动更新病毒库
- python列表嵌套合并成一个列表
- [自学第十一天] 静态项目实战_纽曼官网(用时三天)
- tomcat网站根目录在哪里_不会代码怎么自己搭建一个小说网站