[算法练习及思路-程序员面试金典(Java解法)]No97.最小K个数

题号:no97

题目名:最小K个数
原题URL:https://leetcode-cn.com/problems/smallest-k-lcci/
题目描述

设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。

示例

示例 1:

输入: 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))
思路

1.最大优先队列,每次都存下K个数,每次最外边的数都是最大的

2.如果当前值小于最大值,就将队列的最大值出队,然后将当前值加入,如此往复

3.最后将队列的数进行出队

解题代码
public class Solution {
    public int[] smallestK(int[] arr, int k) {
        //使用优先队列处理问题
        if(arr ==null||arr.length==0||k==0) return new int[]{};
        if(k>arr.length) return arr;
        PriorityQueue<Integer> maxQueue = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        for (int i : arr) {
            //队列里面不够k个,直接加入
            if(maxQueue.size()<k) {
                maxQueue.add(i);
                continue;
            }
            //当前位置小于队列中的最小值
            if(maxQueue.peek()>i) {
                maxQueue.poll();
                maxQueue.add(i);
            }
        }
        int[] res = new int[k];
        while (!maxQueue.isEmpty()) {
            res[--k] = maxQueue.poll();
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值