有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
[要求]
时间复杂度为,空间复杂度为
第一行两个整数T, K。分别表示数组个数,需要打印前K大的元素
接下来T行,每行输入格式如下:
开头一个整数N,表示该数组的大小,接下来N个已排好序的数表示数组内的数
从大到小输出输出K个整数,表示前K大。
3 5 5 219 405 538 845 971 2 148 558 4 52 99 348 691
971 845 691 558 538
保证各个输入值合法
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.PriorityQueue; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] params = br.readLine().split(" "); int t = Integer.parseInt(params[0]), k = Integer.parseInt(params[1]); PriorityQueue<Integer> minHeap = new PriorityQueue<>(); while(t-- > 0){ params = br.readLine().split(" "); int n = Integer.parseInt(params[0]); int[] arr = new int[n]; for(int i = 0; i < n; i++){ int num = Integer.parseInt(params[i + 1]); if(minHeap.size() < k){ minHeap.offer(num); }else{ if(minHeap.peek() < num){ minHeap.poll(); minHeap.offer(num); } } } } int[] res = new int[k]; for(int i = k - 1; i >= 0; i--) res[i] = minHeap.poll(); for(int i = 0; i < k; i++) System.out.print(res[i] + " "); } }
import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc=new Scanner(System.in); while(sc.hasNext()){ int n=sc.nextInt(); int[][] arr=new int[n][]; int[] pos=new int[n]; int k=sc.nextInt(); for(int i=0;i<n;i++){ int tmp=sc.nextInt(); int[] A=new int[tmp]; pos[i]=tmp-1; for(int j=0;j<tmp;j++){ A[j]=sc.nextInt(); } arr[i]=A; } solve(arr,pos,k); } sc.close(); } public static void solve(int[][] arr,int[] pos,int k) { StringBuilder sb=new StringBuilder(); for(int i=0;i<k;i++) { int tmp=arr[0][pos[0]]; int index=0; for(int j=1;j<arr.length;j++) { if(pos[j]>0&&arr[j][pos[j]]>tmp) { tmp=arr[j][pos[j]]; index=j; } } pos[index]--; sb.append(tmp).append(" "); } System.out.println(sb.toString().trim()); } }