如果是双层矩阵中找某个值,则可以从右上角开始找
找第k个小的值,则可以利用归并来归并每一行
多路归并有链表的多路归并,每次加入pq中一个节点,而数组其实也一样,每次加入一个三个值的数组,第一个值放现在到达的数组的值,第二个值放链表的顺序,第三个值放此矩阵中的值顺序。非常巧妙的方法。
import java.util.PriorityQueue;
import java.util.Arrays;
class Solution {
public int kthSmallest(int[][] matrix, int k) {
PriorityQueue<int[]> pq = new PriorityQueue<int[]>(new Comparator<int[]>() {
public int compare(int[] a, int[] b) {
return a[0] - b[0];
}
});
for(int i=0;i<matrix.length;i++){
pq.offer(new int[]{matrix[i][0], i, 0});
}
int res=-1;
for(int i=0;i<k;i++){
int[] temp=pq.poll();
res=temp[0];
if(matrix[temp[1]].length>temp[2]+1){
pq.offer(new int[]{matrix[temp[1]][temp[2]+1], temp[1], temp[2]+1});
}
}
return res;
}
}