LeetCode与面试中的高频题型——Top K个数的解法,使用堆数据结构与快排算法

这是LeetCode中的剑指offer的题目,原题目如下陈述:
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
这类问题我们称之为topK问题,也是给你一堆的数,你来找到其中最小的K个,或者最大的K个数据,输入就是数组,还有K个
算法思想:
使用JAVA语言解题十分的方便,因为java语言中有priorityqueue的大根堆与小根堆数据结构,其内部是有完全二叉树进行实现的,固定长度的K,自动进行排序。进行删除堆顶与堆底部的操作。但是由于java语言中的priorityqueue默认是使用

class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        if(k==0){
            return new int[0];
        }//规定的K为0,最终的输出的数组大小为null

        Queue<Integer> heap = new PriorityQueue<Integer>(k,(i1,i2)->Integer.compare(i2,i1)); //di
          for (int e : arr) {
        // 当前数字小于堆顶元素才会入堆
        if (heap.size() < k || e < heap.peek()) {
            heap.offer(e);
        }
        if (heap.size() > k) {
            heap.poll(); // 删除堆顶最大元素
        }
    }
        int[] res =new int[heap.size()];
        int j=0;
        for(int e:heap){
            res[j++]=e;
        }
        return res;
    }
}

在整个的代码中的核心思想在利用java中的大根堆,java中默认是小根堆,大根堆需要重写一下比较器,每次将最大的数进行输出。
数组的数中满足堆不没有满的时候,且数组的数比heap.peek()要小的时候,送入堆中,使得最终的堆中只有最小的数,将其转化为数组输出。
快排的算法需要将进行变形,将其改写为快速选择的算法,进行选择,有兴趣的读者可以自己试试,欢迎评论区留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

千与编程

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值