后端开发刷题 | 最小的K个数(优先队列)

描述

给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。

数据范围:0≤k,n≤10000,数组中每个数的大小0≤val≤1000

要求:空间复杂度 O(n) ,时间复杂度 O(nlogk)

示例1

输入:

复制代码
[4,5,1,6,2,7,3,8],4 

返回值:

复制代码
[1,2,3,4]

说明:

复制代码
返回最小的4个数即可,返回[1,3,2,4]也可以        

示例2

输入:

复制代码
[1],0

返回值:

复制代码
[]

示例3

输入:

复制代码
[0,1,2,1,2],3

返回值:

复制代码
[0,1,1]

思路分析:

该题可以使用优先队列PriorityQueue来解决这个问题,

因为PriorityQueue添加进去的数据会默认自然排序,想以升序检索元素。在这种情况下,优先队列的头是最小的元素。检索到该元素后,下一个最小的元素将成为队列的头。

那么可以把input数组添加进去,然后循环取优先队列的头元素,添加进去集合re里面。

代码:

java 复制代码
import java.util.*;


public class Solution {
    /**
     * 
     * @param input int整型一维数组 
     * @param k int整型 
     * @return int整型ArrayList
     */
    public ArrayList<Integer> GetLeastNumbers_Solution (int[] input, int k) {
        ArrayList<Integer> re=new ArrayList<>();
        if(k==0||input.length==0) return re;
        PriorityQueue<Integer> q=new PriorityQueue<>();
        for(int i=0;i<input.length;i++){
            q.add(input[i]);
        }
        for(int i=0;i<k;i++){
            re.add(q.poll());
        }
        return re;
    }
}
相关推荐
Young_Zn_Cu17 分钟前
LeetCode刷题记录(持续更新中)
算法·leetcode
天选之女wow22 分钟前
【代码随想录算法训练营——Day31】贪心算法——56.合并区间、738.单调递增的数字、968.监控二叉树
算法·leetcode·贪心算法
lixinnnn.25 分钟前
贪心:火烧赤壁
数据结构·c++·算法
小小前端_我自坚强28 分钟前
前端算法相关详解
前端·算法
珹洺31 分钟前
Java-Spring入门指南(二十一)Thymeleaf 视图解析器
java·开发语言·spring
Predestination王瀞潞35 分钟前
类的多态(Num020)
开发语言·c++
Predestination王瀞潞35 分钟前
类的继承(Num019)
开发语言·c++
源码集结号41 分钟前
一套智慧工地云平台源码,支持监管端、项目管理端,Java+Spring Cloud +UniApp +MySql技术开发
java·mysql·spring cloud·uni-app·源码·智慧工地·成品系统
EnCi Zheng44 分钟前
Spring Security 最简配置完全指南-从入门到精通前后端分离安全配置
java·安全·spring
程序员小假1 小时前
为什么这些 SQL 语句逻辑相同,性能却差异巨大?
java·后端