eg:从一亿个数中取出最小的k个数字
分析:
大顶堆满足,当前元素永远大于他的左右子树的值,非叶子节点的下标为n/2-1,左子树下标为i*2+1右子树下标为i*2+2
源码:
import java.util.ArrayList;
/*** eg:一亿个数中取出最小的k个数* 采用大堆顶方式*/
public class AyyayDemo {/*** 维护这个堆,使其成为一个大顶堆* @param index 下标* @param arr   大顶堆数组*/private static void initHeap(int index, int[] arr) {//把当前下标的元素赋值给tempint temp = arr[index];//关键代码部分:比较当前节点的左右子路的值,把最大值和当前元素,再毕竟,找出最大值,放在当前下标index的位置上for (int i = index * 2 + 1; i < arr.length; i = i * 2 + 1) {//比较左右节点的大小,控制数据不要下标越界if (i + 1 < arr.length && arr[i] < arr[i + 1]) {i++;}//把左右子路中最大的元素的值和此元素的值比较,最大的值和此元素互换位置if (arr[i] > temp) {arr[index] = arr[i];index = i;} else {break;}}arr[index] = temp;}/*** @param input user输入的数组* @param k     k个最小的数* @return*/private static ArrayList<Integer> GetNumbers(int[] input, int k) {if (k > input.length || k == 0) {//输入错误,返回空数组return new ArrayList<>();}//大堆顶,是二叉树的数据结构,底层也是数据,heap堆就是我们需要维护的大顶堆int[] heap = new int[k];//把输入的input数组的前k个元素,复制到head数组中,(参数说明,把input数组从0下标开始复制k个元素给heap数组)System.arraycopy(input, 0, heap, 0, k);//i是非叶子节点的下标(n/2 -1 )for (int i = k / 2 - 1; i >= 0; i--) {initHeap(i, heap);}for (int i = k; i < input.length; i++) {//维护大顶堆其实也就是维护head[0]这个元素if (heap[0] > input[i]) {heap[0] = input[i];initHeap(0, heap);}}ArrayList<Integer> list = new ArrayList<>();for (int value : heap) {list.add(value);}return list;}public static void main(String[] args) {int[] i = new int[]{3, 4, 1, 66, 33, 22, 1, 2, 4, 6, 4};ArrayList<Integer> integers = GetNumbers(i, 6);System.out.println(integers);}
}

用大顶堆取出一个数组中最小的k个数相关推荐

  1. 【算法】数组与矩阵问题——找到无序数组中最小的k个数

    1 /** 2 * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) 3 * 过程: 4 * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 5 * 在堆里的k个元素中堆顶 ...

  2. 小米笔试题:无序数组中最小的k个数

    题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...

  3. 找出无序数组中最小的k个数(top k问题)

    2019独角兽企业重金招聘Python工程师标准>>> 给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序之后自然可以 ...

  4. [剑指 offer]--大顶堆 ➕ 快速选择 --面试题40. 最小的k个数

    1 题目描述 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], ...

  5. 寻找数组中最小的k个数(快排和堆排)

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路1:利用快排的思想,寻找第k个位置上正确的数,k位置前面的数即 ...

  6. 窥探算法之美妙——寻找数组中最小的K个数python中巧用最大堆

    原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...

  7. 从一个数组中找出 N 个数,其和为 M 的所有可能--最 nice 的解法

    比起讨论已经存在的大牛,我们更希望有更多有潜力的前端小伙伴成为大牛,只有这样,前端在未来才能够持续不断的发光发热. 故事的背景 这是一个呆萌炫酷吊炸天的前端算法题,曾经乃至现在也是叱咤风云在各个面试场 ...

  8. c++如何输入数组_从一个数组中找出 N 个数,其和为 M 的所有可能最 nice 的解法...

    编者按:本文由前端狂想录公众号授权奇舞周刊转载. 故事的背景 这是一个呆萌炫酷吊炸天的前端算法题,曾经乃至现在也是叱咤风云在各个面试场景中. 可以这样说,有 90% 以上的前端工程师不会做这个题目. ...

  9. 改进,从一个数组中找出 N 个数,其和为 M 的所有可能

    特此说明,本文算法改自于<从一个数组中找出 N 个数,其和为 M 的所有可能--最 nice 的解法>一文.本文不同的是,采用二进制正序表示法,这种实现思路更直观.更简单些. 问题 从一个 ...

最新文章

  1. 可以分屏的软件_Mac上的分屏功能,让你办公更高效
  2. 作为程序员,我在电脑上都装过哪些 Chrome 插件?
  3. 201809-1—卖菜
  4. 如何在Mac上使用Memoji贴纸、屏幕效果、应用程序和Messages
  5. 编译libpng出错:pnglibconf.c fatal error: zlib.h 没有那个文件或目录
  6. Power BI DAX 之日期函数
  7. shiro的原理理解
  8. 把一个人的特点写具体作文_把一个人的特点写具体
  9. 解决android.support.multide... keeps stopping问题
  10. 【Windows系统】产品ID、设备ID等系统参数
  11. 三星手机终于更新系统了,我的是s22u
  12. 计算机横向查找,Excel查找引用函数:HLOOKUP查找首行并显示指定的值-excel技巧-电脑技巧收藏家...
  13. 单片机教学打铃控制器C语言
  14. CFont::CreateFont
  15. Portainer容器可视化工具
  16. html图片背景属性,css 背景(background)属性、背景图定位
  17. iOS runtime再学习
  18. ppt模板有哪些网站
  19. 计算机作文范文,未来计算机作文范文.docx
  20. 恢复格式化硬盘数据之前的QQ聊天记录

热门文章

  1. ocp跟oce的区别 oracle_六种角度看OCA与OCP、OCM区别
  2. UNP编程:31---名字与地址转换之(服务解析函数:getservbyname()、getservbyport()、struct  servent)
  3. 【LeetCode】871. Minimum Number of Refueling Stops 解题报告(Python)
  4. 【pytorch】简单BP神经网络用于通用分类任务的代码模板
  5. 关于麦克风的参数介绍 - 驻极体麦克风(ECM)和硅麦(MEMS)
  6. 第一篇——重装系统(微PE)
  7. c语言编译器uwp版,Win10技巧:注册UWP版文件资源管理器
  8. 产品经理必备知识之如何全方位进行表单设计,一文带你通读表单设计的全过程
  9. 使用idea搭建ssm框架,并实现简单的CRUD和分页查询功能
  10. Objective-C 编程语言官网文档(一)-简介