力扣 面试题 17.14. 最小K个数

题目来源:https://leetcode-cn.com/problems/smallest-k-lcci/

大致题意:
给定一个数组和整数 k,返回数组中前 k 小的数

思路

排序

直接使用快排。然后取出前 k 个元素。
时间复杂度 O(nlogn),空间复杂度 O(logn)

优先队列

使用优先队列,也就是大根堆存下 k 个最小的数。

1.遍历数组。 初始时先放入 k 个数入队
2. 当已有 k 个数时,判断当前元素与队头元素,若当前元素小于队头元素则替换
3. 重复这个过程,直至遍历结束
4. 最后的队列中即为最小的 k 个数

代码:

public int[] smallestK(int[] arr, int k) {
        int[] ans = new int[k];
        // k 为 0,直接返回
        if (k == 0) {
            return ans;
        }
        // 定义大根堆
        PriorityQueue<Integer> kQueue = new PriorityQueue<Integer>((a, b) -> b - a);
        for (int num : arr) {
            // 先放入 k 个数
            if (kQueue.size() < k) {
                kQueue.offer(num);
            }
            else {
                // 若更小则替换
                if (num < kQueue.peek()) {
                    kQueue.poll();
                    kQueue.offer(num);
                }
            }
        }
        // 出队,入数组
        for (int i = 0; i < k; i++) {
            ans[i] = kQueue.poll();
        }

        return ans;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三更鬼

谢谢老板!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值