import lombok.Data;import java.util.Arrays;import java.util.PriorityQueue;/**@author https://github.com/yanglbme*/@Datapublic class DataWithSource implements Comparable {/**数值*/private int value;/**记录数值来源的数组*/private int source;/**记录数值在数组中的索引*/private int index;public DataWithSource(int value, int source, int index) {this.value = value;this.source = source;this.index = index;}/***由于 PriorityQueue 使用小顶堆来实现,这里通过修改两个整数的比较逻辑来让 PriorityQueue 变成大顶堆*/@Overridepublic int compareTo(DataWithSource o) {return Integer.compare(o.getValue(), this.value);}}class Test {public static int[] getTop(int[][] data) {int rowSize = data.length;int columnSize = data[0].length;// 创建一个columnSize大小的数组,存放结果int[] result = new int[columnSize];PriorityQueue<DataWithSource> maxHeap = new PriorityQueue<>();for (int i = 0; i < rowSize; ++i) {// 将每个数组的最大一个元素放入堆中DataWithSource d = new DataWithSource(data[i][0], i, 0);maxHeap.add(d);}int num = 0;while (num < columnSize) {// 删除堆顶元素DataWithSource d = maxHeap.poll();result[num++] = d.getValue();if (num >= columnSize) {break;}d.setValue(data[d.getSource()][d.getIndex() + 1]);d.setIndex(d.getIndex() + 1);maxHeap.add(d);}return result;}public static void main(String[] args) {int[][] data = {{29, 17, 14, 2, 1},{19, 17, 16, 15, 6},{30, 25, 20, 14, 5},};int[] top = getTop(data);System.out.println(Arrays.toString(top)); // [30, 29, 25, 20, 19]}
}
