剑指 Offer 40. 最小的k个数(堆排序法)

本文介绍了使用Java实现堆排序的详细过程,通过创建一个大根堆并不断调整堆来找出最小的k个数。代码注释清晰,着重讲解了如何利用优先队列(PriorityQueue)进行堆排序,并强调了比较方法的重要性。适用于理解堆排序原理及Java编程实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用sort的方法就不写了,没有什么意义
下面代码为堆排序的解法
思路都在代码注解中了,用堆挺简单的,还是调用API,没什么要说的
注意要重优先队列的比较方法

public int[] getLeastNumbers(int[] arr, int k) {
        if (k == 0){
            return new int[0];
        }

        /** 创建一个大根堆,size为k,将数组元素存入堆中,
         * 如果比堆顶还要到,就直接跳过,
         * 如果比堆顶小,就将堆底弹出,将该数放出堆中*/
        PriorityQueue<Integer> priorityQueue = new PriorityQueue<>((v1,v2) -> v2 - v1);
        for (int i :
                arr) {
            if (priorityQueue.size() < k)   priorityQueue.add(i);
            else if (priorityQueue.peek() > i){
                priorityQueue.poll();
                priorityQueue.add(i);
            }
        }

        /** 取出对顶元素*/
        int[] result = new int[priorityQueue.size()];
        int i = 0;
        for (int res:
                priorityQueue) {
            result[i++] = res;
        }
        return result;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值