【剑指Offer】最小的k个数---大顶堆 Java
题目:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
求数组中最小(最大)的n个数通常可以使用大顶堆(小顶堆)的方法来是实现。大顶堆容易获取到堆中最大的数,若当前数比堆顶大,则可以直接舍去,因此更便于维护。小顶堆则相反,适用于求取前n大的数。
class Solution {public int[] getLeastNumbers(int[] arr, int k) {if(k==0)return new int[0];if(k==arr.length)return arr;int[] res=new int[k];//复制前k个数,作为大顶堆的数组初始化。for(int i=0;i<k;i++){res[i]=arr[i];}build(res);//构建大顶堆//第k个数之后的数依次与堆顶比较;若比堆顶大则直接排除;若比堆顶小则替换当前堆顶,并维护堆。for(int i=k;i<arr.length;i++){if(arr[i]<res[0]){res[0]=arr[i];maintain(res,0);}}return res;}public void build(int[] res){//建大顶堆;将大顶堆用数组的形式表示。//父节点索引(i-1)/2;左子索引2*i+1;右子索引2*i+2。int last=(res.length-1)/2;//找出最后一个父节点的位置while(last>=0){maintain(res,last--);//对每个父节点进行维护,直到堆顶。}}public void maintain(int[] res,int l){if(l>=res.length)return;int c1=2*l+1;//左子节点索引int c2=2*l+2;//右子节点索引int max=l;//初始化max为根节点if(c1<res.length&&res[c1]>res[max])max=c1;if(c2<res.length&&res[c2]>res[max])max=c2;if(max!=l){//若父节点不是三个节点中最大的,则换位。int temp=res[l];res[l]=res[max];res[max]=temp;maintain(res,max);//维护新换父节点的子树}}
}
【剑指Offer】最小的k个数---大顶堆 Java相关推荐
- 剑指offer 最小的k个数 leetcode 215. Kth Largest Element in an Array
注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...
- 《剑指offer》NO40 最小的K个数 大顶堆实现 详解 <Java实现>
public class Solution2_大顶堆 {//用PriorityQueue 来实现一个大顶堆. 当队内元素个数大于K个并且新入的元素小于 大顶堆的最大值,那么就出队列,新的进入.所有元素 ...
- 剑指offer——最小的K个数和数组中第K大的元素
解题思路: 乘着做这个题,顺便复习下堆排序. 先说堆排序是一个什么东西:https://blog.csdn.net/u013384984/article/details/79496052 大顶堆升序, ...
- 剑指offer 最小的k个数
输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 排序解决的. import java.util.*; public clas ...
- 剑指Offer_29_最小的K个数
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题思路 解法1 大顶堆,存放k个数字,遍历数组,当堆的数量小于k ...
- 剑指offer40 最小的k个数
这个题目最坑的是 这个输入的k是几 那么输出的个数就是几 如果全是重复的 比如[1,1,1,1,1,1,1] 如果k=2 那么只能输出[1,1] 题目给的这两个样例完全不能体现这一点啊! 而且第一个样 ...
- leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排
leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...
- 剑指offer之求两个数之和(不能使用四则运算)
1 题目 剑指offer之求两个数之和(不能使用四则运算) 2 代码实现 #include<stdio.h>int add(int num1, int num2) {int sum1;in ...
- 《LeetCode力扣练习》剑指 Offer 25. 合并两个排序的链表 Java
<LeetCode力扣练习>剑指 Offer 25. 合并两个排序的链表 Java 一.资源 题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: ...
最新文章
- pytorch loss function 总结
- python在中国的发展-为什么Python发展这么快,有哪些优势?
- 【Docker】Segmentation Fault or Critical Error encountered. Dumping core and abort
- 拓端tecdat|R语言基于ARCH模型股价波动率建模分析
- 修改Win7的默认文件夹排列方式
- mac上好看的时钟屏保
- 密码学·编码类密码·CTF常见考察密码
- 虎爸虎妈看过来,AI时代,陪孩子玩什么游戏?
- ModbusTCP协议,上位机通讯测试实例分享
- 解决VMware装上Mac后icloud无法激活 【安装QQ发现不能注册Apple ID】
- Zero-shot Learning零样本学习 论文阅读(五)——DeViSE:A Deep Visual-Semantic Embedding Model
- [github] github入手教程
- xilinx官方pcie dma例程 -xapp859仿真环境搭建
- python求导并作图_科学网—python-符号运算(求导等) - 夏江江的博文
- 分享下被偷走的那些年,我在做外包的心得体会
- subprocess.Popen()
- 【钉钉-场景化能力包】制造业订单交付全过程管理
- 周鸿祎:可穿戴设备将带来安全问题
- 2021-2027全球与中国反洗钱工具市场现状及未来发展趋势
- Python3一行代码实现图片文字识别