有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 */