自建堆,也可以用set去代替,还有优先队列也可以
TreeSet得到set中的第一个值 ,用set.iterator().next()得到
Set<Knode> set = new TreeSet<>();
class Knode implements Comparable<Knode> { //每个数是一个类,储存如下信息
package 左神算法第8章数组和矩阵问题.第20题打印N个数组整体最大的TopK;
import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
/**
* Created by Administrator on 2018/2/6 0006.
* 可以用堆排序,维护一个N堆,存放每个数组的最后一个值,即当前的最大值,从堆顶源源不断的输出数,输出为10个为止
* 可以自己写代码建立堆,也可以用TreeSet或者优先队列
*/
public class Main {
public static void main(String[] args) {
int[][] arr = {{100, 743, 901},
{16, 18, 160, 344, 459, 526, 847, 852, 858},
{99, 182, 397, 436, 472, 485, 578, 593, 777},
{30, 112, 908}
};
、、System.out.println(Arrays.toString(getTopK(arr, 100)));
}
//set实现
public static int[] getTopK1(int[][] arr, int k){
int sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
sum += 1;
}
}
int[] res = new int[k > sum? sum : k];
Set<Knode> set = new TreeSet<>();
for (int i = 0; i < arr.length; i++) {
Knode knode = new Knode(arr[i][arr[i].length -1], i, arr[i].length -1);
set.add(knode);
}
int count = 0;
while (count < k && set.size() != 0){
Knode tmp = set.iterator().next();
set.remove(tmp);
res[count] = tmp.value;
++count;
if (tmp.index > 0){
Knode knode = new Knode(arr[tmp.arrNum][tmp.index -1], tmp.arrNum, tmp.index -1);
set.add(knode);
}
}
return res;
}
}
class Knode implements Comparable<Knode> { //每个数是一个类,储存如下信息
public int value; //数的值是多少
public int arrNum;//来自哪个数组
public int index; //在该数组中的下标
public Knode(int value,int arrNum, int index) {
this.arrNum = arrNum;
this.index = index;
this.value = value;
}
@Override
public int compareTo(Knode o) {
return o.value - this.value;
}
}