题目:输入整数数组 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相关推荐

  1. 剑指offer 最小的k个数 leetcode 215. Kth Largest Element in an Array

    注意multiset的一个bug: multiset带一个参数的erase函数原型有两种.一是传递一个元素值,如上面例子代码中,这时候删除的是集合中所有值等于输入值的元素,并且返回删除的元素个数:另外 ...

  2. 《剑指offer》NO40 最小的K个数 大顶堆实现 详解 <Java实现>

    public class Solution2_大顶堆 {//用PriorityQueue 来实现一个大顶堆. 当队内元素个数大于K个并且新入的元素小于 大顶堆的最大值,那么就出队列,新的进入.所有元素 ...

  3. 剑指offer——最小的K个数和数组中第K大的元素

    解题思路: 乘着做这个题,顺便复习下堆排序. 先说堆排序是一个什么东西:https://blog.csdn.net/u013384984/article/details/79496052 大顶堆升序, ...

  4. 剑指offer 最小的k个数

    输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 排序解决的. import java.util.*; public clas ...

  5. 剑指Offer_29_最小的K个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解题思路 解法1 大顶堆,存放k个数字,遍历数组,当堆的数量小于k ...

  6. 剑指offer40 最小的k个数

    这个题目最坑的是 这个输入的k是几 那么输出的个数就是几 如果全是重复的 比如[1,1,1,1,1,1,1] 如果k=2 那么只能输出[1,1] 题目给的这两个样例完全不能体现这一点啊! 而且第一个样 ...

  7. leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排

    leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...

  8. 剑指offer之求两个数之和(不能使用四则运算)

    1 题目 剑指offer之求两个数之和(不能使用四则运算) 2 代码实现 #include<stdio.h>int add(int num1, int num2) {int sum1;in ...

  9. 《LeetCode力扣练习》剑指 Offer 25. 合并两个排序的链表 Java

    <LeetCode力扣练习>剑指 Offer 25. 合并两个排序的链表 Java 一.资源 题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的. 示例1: ...

最新文章

  1. pytorch loss function 总结
  2. python在中国的发展-为什么Python发展这么快,有哪些优势?
  3. 【Docker】Segmentation Fault or Critical Error encountered. Dumping core and abort
  4. 拓端tecdat|R语言基于ARCH模型股价波动率建模分析
  5. 修改Win7的默认文件夹排列方式
  6. mac上好看的时钟屏保
  7. 密码学·编码类密码·CTF常见考察密码
  8. 虎爸虎妈看过来,AI时代,陪孩子玩什么游戏?
  9. ModbusTCP协议,上位机通讯测试实例分享
  10. 解决VMware装上Mac后icloud无法激活 【安装QQ发现不能注册Apple ID】
  11. Zero-shot Learning零样本学习 论文阅读(五)——DeViSE:A Deep Visual-Semantic Embedding Model
  12. [github] github入手教程
  13. xilinx官方pcie dma例程 -xapp859仿真环境搭建
  14. python求导并作图_科学网—python-符号运算(求导等) - 夏江江的博文
  15. 分享下被偷走的那些年,我在做外包的心得体会
  16. subprocess.Popen()
  17. 【钉钉-场景化能力包】制造业订单交付全过程管理
  18. 周鸿祎:可穿戴设备将带来安全问题
  19. 2021-2027全球与中国反洗钱工具市场现状及未来发展趋势
  20. Python3一行代码实现图片文字识别

热门文章

  1. GIF修复(图片隐写)
  2. 汇编语言——指令系统小结
  3. 【043】RainyMood-下雨天的粉红噪音
  4. 标准和非标poe交换机如何选择
  5. 循环结构简单题之分硬币
  6. python除法float float_python中的float除法和整除法
  7. 19c打补丁简易步骤
  8. 哪个系统检测论文比较好?
  9. vue+echart图表数据切换
  10. C++共享指针的父类和子类转化