【算法】数组与矩阵问题——找到无序数组中最小的k个数
1 /** 2 * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) 3 * 过程: 4 * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 5 * 在堆里的k个元素中堆顶的元素是最小的k个数中最大的那个。 6 * 2.接下来,遍历整个数组,遍历过程中看当前数是否比堆顶元素小: 7 * 如果是,就把堆顶元素替换成当前的数,然后从堆顶的位置调整整个堆,让替 8 * 换操作后堆的最大元素继续处在堆顶的位置; 9 * 如果不是,则不进行任何操作,继续遍历下一个数; 10 * 3.在遍历完成后,堆中的k个数就是所有数组中最小的k个数 11 */ 12 public class getMinKNumsByHeap { 13 14 public int[] getMinKNumsByHeap(int[] arr, int k) { 15 if (k < 1 || k > arr.length) { 16 return arr; 17 } 18 int[] kHeap = new int[k]; 19 for (int i = 0; i < k; i++) { 20 heapInsert(kHeap, arr[i], i); 21 } 22 for (int i = k; i != arr.length; i++) { 23 if (arr[i] < kHeap[0]) { 24 kHeap[0] = arr[i]; 25 heapify(kHeap, 0, k); 26 } 27 } 28 return kHeap; 29 } 30 31 // 建堆的过程 32 private void heapInsert(int[] arr, int value, int index) { 33 34 arr[index] = value; 35 while (index != 0) { 36 int parent = (index - 1) / 2; 37 if (arr[parent] < arr[index]) { 38 swap(arr, parent, index); 39 index = parent; 40 } else { 41 break; 42 } 43 } 44 } 45 46 // 调整堆的过程 47 private void heapify(int[] arr, int index, int heapSize) { 48 49 int left = index * 2 + 1; 50 int right = index * 2 + 2; 51 int largest = index; 52 while (left < heapSize) { 53 if (arr[left] > arr[index]) { 54 largest = left; 55 } 56 if (right < heapSize && arr[right] > arr[largest]) { 57 largest = right; 58 } 59 if (largest != index) { 60 swap(arr, largest, index); 61 } else { 62 break; 63 } 64 index = largest; 65 left = index * 2 + 1; 66 right = index * 2 + 2; 67 } 68 } 69 70 // 交换 71 public void swap(int[] arr, int index1, int index2) { 72 int tmp = arr[index1]; 73 arr[index1] = arr[index2]; 74 arr[index2] = tmp; 75 } 76 }
转载于:https://www.cnblogs.com/qinwangchen/p/6106398.html
【算法】数组与矩阵问题——找到无序数组中最小的k个数相关推荐
- 找出无序数组中最小的k个数(top k问题)
2019独角兽企业重金招聘Python工程师标准>>> 给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序之后自然可以 ...
- 小米笔试题:无序数组中最小的k个数
题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...
- 窥探算法之美妙——寻找数组中最小的K个数python中巧用最大堆
原文发表在我的博客主页,转载请注明出处 前言 不论是小算法或者大系统,堆一直是某种场景下程序员比较亲睐的数据结构,而在python中,由于数据结构的极其灵活性,list,tuple, dict在很多情 ...
- 寻找数组中最小的k个数(快排和堆排)
题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路1:利用快排的思想,寻找第k个位置上正确的数,k位置前面的数即 ...
- 用大顶堆取出一个数组中最小的k个数
eg:从一亿个数中取出最小的k个数字 分析: 大顶堆满足,当前元素永远大于他的左右子树的值,非叶子节点的下标为n/2-1,左子树下标为i*2+1右子树下标为i*2+2 源码: import java. ...
- 数据结构与算法--最小的k个数
最小的k个数 题目:输入n个整数,找出其中最小的k个数,例如输入4,5,6,7,8,9这六个数字,则最小的4个是4,5,6,7 方案一 还是最直观的方法,先排序,最快的是快排O(nlog2n),然后遍 ...
- c语言从4个整数中找最小的数,编程之法:面试和算法心得(寻找最小的k个数)...
内容全部来自编程之法:面试和算法心得一书,实现是自己写的使用的是java 题目描述 输入n个整数,输出其中最小的k个. 分析与解法 解法一 要求一个序列中最小的k个数,按照惯有的思维方式,则是先对这个 ...
- 找出无序数组最小的K个数(基于快排,效率高)
快排: void QuickSort(int array[], int low, int high) { if (low >= high) //为了防止无限递归下去,导致栈溢出,设置此条件 { ...
- 《剑指offer》-- 数组中的逆序对、最小的K个数、从1到n整数中1出现的次数、正则表达式匹配、数值的整数次方
一.数组中的逆序对: 1.题目: 数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出 ...
最新文章
- 实验四 JSP数据库编程基础
- python导入词云包失败:ImportError:cannot import name ‘WordCloud’
- vue 自己写上传excel组件_vue结合elementui组件 el-upload 上传excel表格(二)
- 黑马Go语言与区块链学习笔记
- QMouseEvent 的坐标__Win
- html超文本链接本页面,从HTML语言到网上家园 第三章 超文本链接(1)-网页设计,HTML/CSS...
- 他不怕被拒绝_不会敬酒很吃亏,送你五个敬酒词的模版,再也不怕劝酒了
- java string.format_如果性能很重要,我应该使用Java的String.format()吗?
- 如何产生好的词向量?
- 16.凤凰架构:构建可靠的大型分布式系统 --- 向微服务迈进
- 时间序列分析与非参数统计
- 色彩特征提取-色彩属性HSV空间
- PDF如何编辑,怎么删除PDF页眉页脚
- 打包Hololens2 VS error MSB3774: 找不到 SDK“WindowsMobile, Version=10.0.19041.0”解决办法
- elixir元编程的quote与unquote
- Win10自带的录屏功能怎么用?
- UnicodeDecodeError: 'utf-8' codec can't decode byte 0xca in position 491: invalid continuation byte
- 电路设计实例(防止DC电源反接的方法)
- windows扩充C盘容量(删除Ubuntu分区)
- python键盘上下左右控制_python方向键控制上下左右代码
热门文章
- 2018年最实用机器学习项目Top 6(附开源链接)
- 带你自学Python系列(二):Python列表总结-思维导图
- VScode Remote 远程开发与调试(转)
- Matlab线性/非线性规划优化算法(2)
- ios kvo 要引入_iOS多线程之超实用理论+demo演示(可下载)
- 向程序发送命令失败_java程序员进阶:Redis分布式技术问题集锦
- python路径拼接os.path.join()函数完全教程_详解python路径拼接os.path.join()函数的用法...
- mysql 从 a表updateb表_mysql A表自动更新和插入B表的数据
- 华为鸿蒙系统学习笔记3-方舟编译器介绍
- wordpresd免登录发布接口php_屏蔽修改wp-login.php登录入口确保WordPress网站后台安全...