最近看到了 java.util.PriorityQueue。刚看到还没什么感觉,今天突然发现他可以用来找N个数中最小的K个数。


假设有如下 10 个整数。

5 2 0 1 4 8 6 9 7 3

怎么找出最小的 5 个数呢?很好想到的方法是先升序排序,然后取 5 个就可以。

至于怎么排序方法有很多,比如简单的冒泡,选择,”难点”的有快速,希尔和堆等等。

先看看这种比较少见的实现方法的代码,再看看下面的简单介绍。


PriorityQueue实现

import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue; public class FindSmallestKofNNumbers { public List<Integer> findSmallestKofNNumbers( int[] numbers,
int k) { Queue<Integer> queue = new PriorityQueue<>();
for (int i : numbers) {
queue.add(i);
} List<Integer> ans = new ArrayList<>();
for (int i = 0; i < k; ++i) {
ans.add(queue.poll());// 取k个数加到列表中
} return ans;
} }

看完没,代码简单吧,核心代码就几句。创建一个 PriorityQueue 对象,调用 add 方法和 poll 方法。

  1. 创建一个 Integer 类型的一个基于优先级堆的无界优先级队列。元素是按照队列元素的自然顺序进行排序。此队列的是按指定方式确定的最小的元素,如果多个元素都是最小值,则头是其中一个元素——选择方法任意。
  2. boolean add(E e) 将 e 插入此优先级队列。
  3. E poll() 获取并移除此队列的头,如果此队列为空,则返回 null

Arrays.sort()实现

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; public class FindSmallestKofNNumbers { public List<Integer> findSmallestKofNNumbers( int[] numbers,
int k) { int[] arr = Arrays.copyOf(numbers, numbers.length);
Arrays.sort(arr); List<Integer> ans = new ArrayList<>();
for (int i = 0; i < k; ++i) {
ans.add(arr[i]);// 取k个数加到列表中
} return ans;
} }

参考

[1] Class PriorityQueue<E>[OL].oracle,2019.

[2] 王一飞. PriorityQueue详解[OL].简书,2018.

Java找N个数中最小的K个数,PriorityQueue和Arrays.sort()两种实现方法的更多相关文章

  1. 找出N个数中最小的k个数问题(复杂度O(N*logk))

    这是一个经典的算法题,下面给出的算法都在给定的数组基础上进行,好处时不用分配新的空间,坏处是会破坏原有的数组,可以自己分配新的空间以避免对原有数组的破坏. 思路一 先直接排序,再取排序后数据的前k个数 ...

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

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

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

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

  4. 求给定数据中最小的K个数

    public class MinHeap { /* * * Top K个问题,求给定数据中最小的K个数 * * 最小堆解决:堆顶元素为堆中最大元素 * * * */ private int MAX_D ...

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

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

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

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

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

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

  8. Python3求m以内的素数、求m个数中最小的n个数

    [本文出自天外归云的博客园] 题1:求m以内的素数(m>2) def find_all_primes_in(m): def prime(num): for i in range(2, num): ...

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

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

随机推荐

  1. pgloader 学习(一)支持的特性

    pgloader 是一个不错的多种格式数据同步到pg 的工具,pgloader 使用postrgresql 的copy 协议进行高效的数据同步处理 特性 加载文件到内容pg 多种数据源格式的支持 cs ...

  2. 多项式总结&多项式板子

    多项式总结&多项式板子 三角/反三角是不可能放的(也不可能真香的 多项式乘法(DFT,FFT,NTT,MTT) 背板子 前置知识:泰勒展开 如果\(f(x)\)在\(x_0\)处存在\(n\) ...

  3. restframework之节流

    基本思路(原生Django而言): 在django2.x中,若出现节流(访问频率控制)的需求,我们首先想到的是使用一个字典(dict类型)来存储所有IP地址的访问时间记录,这是针对于匿名用户(IP)而 ...

  4. 关于python的深拷贝和浅拷贝

    写类函数的时候出了一个错,原代码写在这里: def Update(self, wm, vm, ts, pos, vn, att): # 上一时刻位置,速度 pos_pre = pos self.pos ...

  5. vuejs cli3 env配置文件实践指南

    env文件 配置四个环境名字分别 VUE_APP_ENV=dev 只支持:VUE_APP_ 开头,比如设置其它变量 VUE_APP_NAME=stark package.json 配置 方式 &quo ...

  6. 稀疏矩阵的存储(c++)

    0        0        0        0        0         0 0        3        0        0        0         0 0    ...

  7. IntelliJ IDEA 2018.2,WebStorm 2018.2破解

    一.IntelliJ IDEA 2018.2.4破解: 可参考:https://www.cnblogs.com/iathanasy/p/9469280.html 二.WebStorm 2018.2.4 ...

  8. MySQL事务部分回滚-回滚到指定保存点

    我们可以在mysql事务处理过程中定义保存点(SAVEPOINT),然后回滚到指定的保存点前的状态. 定义保存点,以及回滚到指定保存点前状态的语法如下. 定义保存点---SAVEPOINT 保存点名; ...

  9. 解决用官方容器启动redmine无法插入中文字符的问题

    jiangzhaowei@kitking:/kitking/redmineIot$ sudo docker-compose up -d Creating network "redmineio ...

  10. Calcite分析 - Rule

    Calcite源码分析,参考: http://matt33.com/2019/03/07/apache-calcite-process-flow/ https://matt33.com/2019/03 ...