题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

package test;import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;import org.junit.Test;public class GetLeastNumbers_Solution {/*** 基于优先队列,时间复杂度为o(nlogk)* * @param input* @param k* @return*/public ArrayList<Integer> GetLeastNumbers_SolutionPriorityQuene(int[] input, int k) {ArrayList<Integer> result = new ArrayList<Integer>();if (input == null || input.length == 0 || k <= 0 || k > input.length)return result;PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2.compareTo(o1);}});for (int i = 0; i < k; i++) {maxHeap.offer(input[i]);}for (int j = k; j < input.length; j++) {if (input[j] < maxHeap.peek()) {maxHeap.poll();maxHeap.offer(input[j]);}}for (Integer integer : maxHeap) {result.add(integer);}return result;}/*** 基于堆排序,时间复杂度为o(nlogk)* * @param input* @param k* @return*/public ArrayList<Integer> GetLeastNumbers_SolutionMaxHeap(int[] input, int k) {ArrayList<Integer> result = new ArrayList<Integer>();if (input == null || input.length == 0 || k <= 0 || k > input.length)return result;//构建最大堆builtMaxHeap(input,k-1);for (int i = k; i < input.length; i++) {//数组k位后的数字比堆顶小if (input[k] < input[0]) {input[0] = input[k];//调整堆builtMaxHeap(input, k - 1);}}for (int i = 0; i < k; i++) {result.add(input[i]);}return result;}/*** 构建、调整最大堆* @param a* @param lastIndex*/public void builtMaxHeap(int[]a,int lastIndex){int parentIndex = ((lastIndex-1) >> 1);//从最后一个节点的父节点开始for(int i=parentIndex;i>=0;i--){//存在子节点while (i*2+1<=lastIndex){int leftIndex = i*2+1;int rightIndex = i*2+2;int biggerIndex = leftIndex;//存在右结点if (rightIndex <= lastIndex){if(a[rightIndex] > a[biggerIndex]){biggerIndex = rightIndex;}}//子节点中最大节点大于父节点if (a[biggerIndex] > a[i]){swap(a,i,biggerIndex);i = biggerIndex;}else{break;}}}}/*** 基于Partition函数,时间复杂度为o(n),原数组已被修改* * @param input* @param k* @return*/public ArrayList<Integer> GetLeastNumbers_SolutionPartition(int[] input,int k) {ArrayList<Integer> result = new ArrayList<Integer>();if (input == null || input.length == 0 || k <= 0 || k > input.length)return result;int left = 0;int right = input.length - 1;int index = partition(input, 0, right);while (index != k - 1) {if (index > k - 1) {right = index - 1;index = partition(input, left, right);} else {left = index + 1;index = partition(input, left, right);}}for (int i = 0; i < k; i++) {result.add(input[i]);}return result;}/*** partition函数* @param a* @param left* @param right* @return*/public int partition(int[] a, int left, int right) {while (left < right) {while (left < right && a[left] <= a[right]) {right--;}if (left < right) {swap(a, left, right);}while (left < right && a[left] <= a[right]) {left++;}if (left < right) {swap(a, left, right);}}return left;}public void swap(int[] a, int i, int j) {int tmp = a[i];a[i] = a[j];a[j] = tmp;}@Testpublic void testGetLeastNumbers_Solution() {int[] a = { 4, 5, 1, 6, 2, 7, 3, 8 };int k = 4;ArrayList<Integer> list = GetLeastNumbers_SolutionPartition(a, k);System.out.println(list.toString());ArrayList<Integer> list2 = GetLeastNumbers_SolutionPriorityQuene(a, k);System.out.println(list2.toString());ArrayList<Integer> list3 = GetLeastNumbers_SolutionMaxHeap(a, k);System.out.println(list3.toString());}
}

除了基于优先队列,时间复杂度为O(nlogk)、堆排序,时间复杂度为O(nlogk)、partition函数,时间复杂度为O(n)的解法之外,还有基于冒泡排序的解法时间复杂度为(nk)

转载于:https://www.cnblogs.com/tongkey/p/7811186.html

求数组中最小的k个数相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 用大顶堆取出一个数组中最小的k个数

    eg:从一亿个数中取出最小的k个数字 分析: 大顶堆满足,当前元素永远大于他的左右子树的值,非叶子节点的下标为n/2-1,左子树下标为i*2+1右子树下标为i*2+2 源码: import java. ...

  7. JavaScript求数组中每个元素的个数,如数组str = [1,2,3,2,4,1,2]中元素2的个数为2。要求:使用对象知识来实现,输出结果为对象,对象包含数组元素和个数值。

    求数组中每个元素的个数,如数组str = [1,2,3,2,4,1,2]中元素2的个数为2. 要求:使用对象知识来实现,输出结果为对象,对象包含数组元素和个数值. <script>var ...

  8. 找出N个元素的数组中最大的K个数

    转载请提供原创链接 http://blog.csdn.net/shuiziliu1025/article/details/50958241 题目: 给出 N 个整数(N可能很大,以致无法装入内存),找 ...

  9. 小顶堆实现求无序数组中的最大k个数

    //建立含有n个元素的小顶堆 void MakeMinHeap(int a[], int n) { for (int i = n / 2 - 1; i >= 0; i--) MinHeapFix ...

  10. java数组中最小的k个元素_java – 在数组中找到k个最小整数

    这是我的代码,它适用于查找1-7个最小整数,但是8和9.当我在数组中找到8个最小整数时,它返回null.任何人都可以帮我解决问题吗?我在这里使用quicksort. 非常感谢! 更新:我已经找到问题, ...

最新文章

  1. 如何学习开源系统有感(一)
  2. intel服务器ssd系列,英特尔发布S3710/S3610服务器SSD新品
  3. 2019年第十届蓝桥杯国赛B组试题A-平方序列-枚举
  4. [转载] 菜鸟举例理解字节流和字符流区别
  5. CSS属性简写规则详解
  6. 威海二职工业机器人专业_工业机器人专业主要学什么?
  7. IDEA 不识别的MAVEN 项目应如何处理
  8. 计算机无法写入U盘,电脑无法拷贝U盘文件怎么办|解除U盘写保护设置的方法
  9. Qt制作简易电子相册
  10. 栅栏CyclicBarrier
  11. 开源免费 低代码平台开源_行动透明:免费代码营现已开源
  12. 二十个不可不知的 TSM 知识点
  13. Janus的STUN原理与抓包分析
  14. 《极简健康: 4,少烦》 — 刘少
  15. 2021年电赛E题解析数字模拟信号混合传输收发机(详细介绍)
  16. Java递归实现围棋提子思想
  17. 微信公众号服务号如何开通微信支付功能
  18. sql语句中表格缩写命名_SQL 语句的缩写
  19. hive函数大全(数学函数,集合函数,类型转换,日期函数,条件函数,字符串函数,及侧视图)
  20. 计算机无法外接投影,解决方法:解决笔记本电脑连接到投影仪时无法显示的问题...

热门文章

  1. Ivy Bridge处理器
  2. 集成hello到OpenDaylight发行版中
  3. 好玩的WPF第一弹:窗体抖动+边框阴影效果+倒计时显示文字
  4. CentOS安装系统时硬盘分区建议
  5. HDOJ 2071 Max Num
  6. nodejs gulp less编辑
  7. 一些Python的惯用法和小技巧:Pythonic
  8. 彼得林奇:赚钱密码(1990年一次演讲)
  9. [一个简单的.NET逆向工程]给没有源代码的.NET程序打补丁
  10. Web 开发与设计师速查手册大全