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. }

【算法】数组与矩阵问题——找到无序数组中最小的k个数的更多相关文章

  1. 《程序员代码面试指南》第八章 数组和矩阵问题 找到无序数组中最小的k 个数

    题目 找到无序数组中最小的k 个数 java代码 package com.lizhouwei.chapter8; /** * @Description: 找到无序数组中最小的k 个数 * @Autho ...

  2. [程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)

    题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&t ...

  3. [算法]找到无序数组中最小的K个数

    题目: 给定一个无序的整型数组arr,找到其中最小的k个数. 方法一: 将数组排序,排序后的数组的前k个数就是最小的k个数. 时间复杂度:O(nlogn) 方法二: 时间复杂度:O(nlogk) 维护 ...

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

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

  5. 求一个数组中最小的K个数

    方法1:先对数组进行排序,然后遍历前K个数,此时时间复杂度为O(nlgn); 方法2:维护一个容量为K的最大堆(<算法导论>第6章),然后从第K+1个元素开始遍历,和堆中的最大元素比较,如 ...

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

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

  7. 找到数组中最小的k个数

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

  8. 求数组中最小的k个数

    题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. package test; import java.util.Arra ...

  9. [剑指offer]数组中最小的K个数,C++实现

    原创博文,转载请注明出处! http://github.com/wanglei5205 http://cnblogs.com/wanglei5205 # 题目 输入n个整数,找出其中最小的K个数.例如 ...

随机推荐

  1. bzoj1455

    学习了一下可合并堆的一种写法——左偏树感觉左偏树是一种类似启发式的方法学习左偏树后这题就水过去了 ..] of longint; v:..] of boolean; i,n,m,x,y,f:longi ...

  2. Hibernate(四)基本映射

    映射的概念 在上次的博文Hibernate(三)Hibernate 配置文件我们已经讲解了一下 Hibernate中的两种配置文件,其中提到了两种配置文件的主要区别就是XML可以配置映射.这里提到的映 ...

  3. zoj 3757 Alice and Bob and Cue Sports 月赛A 模拟

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3757 题意:根据所给的台球规则,按照每次的结果计算最终两人的得分 ...

  4. macbook pro install ubuntu

    https://help.ubuntu.com/community/MacBookPro Determine your hardware revision To determine which ver ...

  5. 不区分大小写的in_array实现 thinkphp框架

    // 不区分大小写的in_array实现 function in_array_case($value,$array) { return in_array(strtolower($value),arra ...

  6. XML认识

    XML概念 XML是eXtensible Markup Langguage 缩写,称之为可扩展标记语言.XML 被设计用来传输和存储数据.与HTML不同的是: HTML被设计用来显示数据,其焦点是数据 ...

  7. vs2012关闭IDE硬件加速设置

    对于我这样的老古董电脑是很有必要的设置! 如图所示:

  8. SVNclient安装与使用

    Technorati 标签: SVN SVNclient安装与使用 1 下载最新版本号1.5.2 最新版本号:TortoiseSVN-1.5.2.13595-win32-svn-1.5.1.msi 下 ...

  9. dump_stack的简单使用 +CALL TREE

    http://blog.chinaunix.net/uid-26403844-id-3361770.html http://blog.csdn.net/zifeng274059226/article/ ...

  10. iOS开发集成微信支付

    首先需要理清楚流程: 1.用户使用APP客户端,选择商品下单. 2.商户客户端(就是你做的APP)将用户的商品数据传给商户服务器,请求生成支付订单. 3.商户后台调用统一下单API向微信的服务器发送请 ...