34 打印N个数组整体最大的TopK
Table of Contents

ac(小根堆求解)

 N个长度不一的数组,所有的数组都是有序的,请从大到小打印这N个数组整体最大的前K个数。
例如,输入含有N行元素的二维数组可以代表N个一维数组。
219, 405, 538, 845, 971
148, 558
52, 99, 348, 691
再输入整数k=5,则打印:
Top 5: 971, 845, 691, 558, 538
[要求]
时间复杂度为O(klogk),空间复杂度为O(klogk)
import java.util.PriorityQueue;
import java.util.Scanner;


public class Main {

    public static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        int n = sc.nextInt();
        int k = sc.nextInt();

        // 小根堆
        PriorityQueue<Integer> heap = new PriorityQueue<>((a,b)->{
           if(a < b){
               return -1;
           }else if(a > b){
               return 1;
           }
           return 0;
        });

        for(int i=0;i<n;i++){
            int len = sc.nextInt();
            for(int j=0;j<len;j++){
                int var = sc.nextInt();
                if(heap.size() < k){
                    heap.add(var);
                }else if(heap.size() == k){
                    if(var > heap.peek()){
                        heap.poll();
                        heap.add(var);
                    }
                }
            }
        }
        int[] ans = new int[k];
        int ansIndex = k-1;
        while(!heap.isEmpty()){
            int var = heap.poll();
            ans[ansIndex --] = var;
        }
        for(int i=0;i<k-1;i++) {
            System.out.print(ans[i] + " ");
        }
        System.out.println(ans[k-1]);
    }
}
/*
3 5
5 219 405 538 845 971
2 148 558
4 52 99 348 691

971 845 691 558 538
*/