码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer40. 最小的 K 个数

时间:2021-04-24 13:14:06      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:for   长度   等于   遍历   lang   保存   容量   题目   NPU   

题目描述
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。如果K>数组的长度,那么返回一个空的数组
示例1
输入
[4,5,1,6,2,7,3,8],4
返回值
[1,2,3,4]

解题思路:这里用优先队列来做,让其容量始终为k个,等于k,并且当前遍历到的元素又比堆顶元素大,那就取出堆定元素并且插入新的元素,默认排好序,因此里面保存的始终是当前遍历到的最小的k个数,堆顶始终是里面最大的一个。PriorityQueue默认是小顶堆,因此要传入一个匿名类Comparator,重写compare方法,将其转化为大顶堆,然后用这个优先队列来保存中间元素,最后将其转换为数组返回。
代码 t80 s96 java

import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        int len = input.length;
        ArrayList<Integer> res = new ArrayList<>();
        if(len<k || k==0) return res;
        PriorityQueue<Integer> pq = new PriorityQueue<>(k, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        for (int i : input) {
            if(pq.size()==k){
                if(i<pq.peek()){
                    pq.poll();
                    pq.add(i);
                }
            }else {
                pq.add(i);
            }
        }
        res.addAll(pq);
        return res;
    }
}

参考资料

剑指offer40. 最小的 K 个数

标签:for   长度   等于   遍历   lang   保存   容量   题目   NPU   

原文地址:https://www.cnblogs.com/zhengxch/p/14694673.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!