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