java——最小的K个数

这篇具有很好参考价值的文章主要介绍了java——最小的K个数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目链接

牛客在线oj题——最小的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]

解题思路

这道题是一个典型的topK问题,可以直接使用任意一种排序,将数组中的元素排成从小到大的顺序,然后直接返回前k个数字

而更好的解法是,构造一个含k个元素的大根堆,先讲数组的前k个元素插入到堆中,然后继续从左到右遍历数组中的元素

大根堆的特性是:堆顶元素比下面所有元素都要大

当遍历到的元素i比大根堆堆顶的元素peek大时,说明i肯定不是最小的k个数之中的元素,继续遍历下一个位置

当遍历到的元素i比大根堆堆顶的元素peek小时,说明peek肯定不是最小的k个数中的元素,把大根堆堆顶元素弹出,将i插入到大根堆中

遍历完整个数组序列,最终大根堆中所有元素就是最小的k个数

例如:
java——最小的K个数
首先将前四个元素插入大根堆
java——最小的K个数
当前遍历到的元素是2,比大根堆堆顶元素6小,将6弹出,将2入大根堆,i++
java——最小的K个数
当前遍历到的元素是7,比大根堆堆顶元素5大,肯定不在最小的k个数中,继续遍历
java——最小的K个数
当前遍历到的元素为3,比大根堆堆顶元素5小,将5弹出大根堆,将3插入到大根堆中
java——最小的K个数
当前遍历到的元素是8,比大根堆堆顶元素4大,肯定不在最小的k个数中,遍历结束,当前大根堆中存放的所有元素就是最小的k个数文章来源地址https://www.toymoban.com/news/detail-426281.html

完整代码

import java.util.*;

public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> result = new ArrayList<>();
        if(input == null || k <= 0 || k > input.length){
            return result;
        }
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(k, Collections.reverseOrder());
        for (int i = 0; i < input.length; i++){
            if(i < k){
                priorityQueue.offer(input[i]);
            } else {
                if(input[i] < priorityQueue.peek()){
                    priorityQueue.poll();
                    priorityQueue.offer(input[i]);
                }
            }
        }
        for (int i = 0; i < k; i++){
            result.add(priorityQueue.poll());
        }
        return result;
    }
}

到了这里,关于java——最小的K个数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C语言】输入三个数输出最大和最小的数

    代码实现 运行结果

    2024年02月08日
    浏览(43)
  • 【C语言】交换最大、最小值。输入一个正整数n(1<n≤10),再输入n个整数(<=999),将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。

    【问题描述】4.4 交换最大、最小值。输入一个正整数n(1n≤10),再输入n个整数(=999),将最小值与第一个数交换,最大值与最后一个数交换,然后输出交换后的n个数。 【输入输出样例】 【样例说明】 输入提示符后冒号为英文字符,后面没有空格。 输出整数序列时按照%4d格

    2024年02月05日
    浏览(57)
  • 【程序员面试金典】面试题 17.14. 最小K个数

    描述:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例: 提示: 0 = len(arr) = 100000 0 = k = min(100000, len(arr)) 思路:最直观的想法是,排序。 扩展:最大堆。最小的k个数,那么就可以维持一个大小为k的最大堆,先填充k个数到最大堆中,然后再依次遍

    2024年02月11日
    浏览(55)
  • 78-快速排序练习-LeetCode面试题17.14.最小k个数

    题目 设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。 示例: 输入: arr = [1,3,5,7,2,4,6,8], k = 4 输出: [1,2,3,4] 提示:     0 = len(arr) = 100000     0 = k = min(100000, len(arr)) 思路 注意到题目要求「任意顺序返回这 k 个数即可」,因此我们只需要确保前 k 小的

    2023年04月12日
    浏览(31)
  • 【LeetCode力扣】面试题 17.14. 最小K个数(top-k问题)

    目录 1、题目介绍 2、解题思路 2.1、优先队列解法 2.2、top-k问题解法 原题链接: 面试题 17.14. 最小K个数 - 力扣(LeetCode)  题目要求非常简短,也非常简单,就是求一组数中的k个最小数。         如果在正常刷题过程中遇到这种题,那么这道题毋庸置疑是秒杀题,使用最

    2024年01月25日
    浏览(41)
  • 算法:分治思想处理快排递归以及快速选择/最小K个数问题

    分治的原理就是分而治之,从原理上讲,就是把一个复杂的问题划分成子问题,再将子问题继续划分,直到可以解决 基于分治的原理进行快速排序,区别于传统的快速排序,这里对快速排序进行改良,成为更优先的三路划分算法,可以处理一些极端场景,使快速排序的适用性

    2024年02月10日
    浏览(52)
  • 题目:1984.学生分数的最小差值

    ​ 题目来源:         leetcode题目,网址:1984. 学生分数的最小差值 - 力扣(LeetCode) 解题思路:        将数组排序后,计算当 i=0,1,2,3.... 时 nums[i+k-1] 与 nums[i] 之差并返回其中的最小值即可。   解题代码: 总结:         官方题解也是一样的思路,滑动窗口。

    2024年02月15日
    浏览(52)
  • 题目3180:蓝桥杯2023年第十四届省赛真题-互质数的个数======及探讨互质专题

    https://www.dotcpp.com/oj/problem3162.html 已AC。 (1)首先大家要知道什么叫互质: 以及它们的性质: 在数论中,对正整数n,欧拉函数φ(n)是小于或等于n的正整数中与n互质的数的数目。此函数以其首名研究者欧拉命名,它又称为φ函数(由高斯所命名)或是欧拉总计函数(totient fu

    2023年04月24日
    浏览(43)
  • 【滑动窗口】长度最小的子数组|无重复字符的最长子串|最大连续1的个数 III|将 x 减到 0 的最小操作数

    1. 长度最小的子数组 - 力扣(LeetCode) (1)方法一:暴力列举出所有的子数组的和 时间复杂度:O(n**2):枚举所有子数组O(n**2) (2)方法二: 利用 单调性(两个指针都不回退) ,使用\\\" 同向双指针 \\\"(其实就是 滑动窗口 )来优化 那么 滑动窗口过程 是怎么样的? 1le

    2024年03月22日
    浏览(52)
  • 王道机试指南(第二版)——题目OJ链接

    王道机试指南(第二版)——题目OJ链接 方便大家跳转检验,侵删。 题目 地址 例题2.1 abc(清华大学复试上机题) 例题2.2 反序数(清华大学复试上机题) 例题2.3 对称平方数1(清华大学复试上机题) 习题2.1 与7无关的数(北京大学复试上机题) 习题2.2 百鸡问题(北京哈尔

    2024年01月17日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包