输入n个整数,输出其中最小的k个

输入n个整数,输出其中最小的k个

http://www.nowcoder.com/questionTerminal/69ef2267aafd4d52b250a272fd27052c

优先队列PriorityQueue修改Comparator为最大堆,空间O(k), 时间O(nlog(k))

import java.util.*;

public class Main {

    public Main() {
    }

    public boolean getMinK(int n, Integer[] pInputArray, int k, Integer[] pOutputArray) {
        if (k > n) return false;
        PriorityQueue<Integer> pq = new PriorityQueue<>(k, new Comparator<Integer>(){
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });
        for (Integer i : pInputArray) {
            if (pq.size() == k && i < pq.peek()) {
                pq.poll();
            }
            if (pq.size() < k) {
                pq.offer(i);
            }
        }
        for (int i = k - 1; i >= 0; i--) {
            pOutputArray[i] = pq.poll();
        }
        return true;
    }

    public static void main(String[] args) {
        Main solution = new Main();
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int n = in.nextInt(), k = in.nextInt();
            Integer[] pInputArray = new Integer[n];
            Integer[] pOutputArray = new Integer[k];
            for (int i = 0; i < n; i++) {
                pInputArray[i] = in.nextInt();
            }
            boolean res = solution.getMinK(n, pInputArray, k, pOutputArray);
            if (res) {
                for (Integer i : pOutputArray) {
                    System.out.print(i + " ");
                }
                System.out.println();
            }
        }
    } 
}
全部评论
**的解法,效率好高
点赞 回复 分享
发布于 2022-03-22 19:18

相关推荐

头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
11 4 评论
分享
牛客网
牛客企业服务