Find the kth smallest number in a row and column sorted matrix.
Each row and each column of the matrix is incremental.
Example 1:
Input:
[
[1 ,5 ,7],
[3 ,7 ,8],
[4 ,8 ,9],
]
k = 4
Output: 5
Example 2:
Input:
[
[1, 2],
[3, 4]
]
k = 3
Output: 3
O*(klogn*) time, n is the maximum of the width and height of the matrix.
思路:
可以使用堆或者二分在 O(klogn) 的时间复杂度内解决问题.
用堆解决:
定义一个小根堆, 起始仅仅放入第一行第一列的元素.
循环 kk 次, 每一次取出一个元素, 然后把该元素右方以及下方的元素放入堆中, 第 kk 次取出的元素即为答案.
其中, 要注意一个元素不能重复入堆, 需要记录.
二分法:
二分答案,初始区间即矩阵最小值和最大值构成的区间.
二分过程查找区间中点 mid 在矩阵中的排名, 假设为 t
public class Solution {
/**
* @param matrix: a matrix of integers
* @param k: An integer
* @return: the kth smallest number in the matrix
*/
class Pair {
public int x, y, val;
public Pair(int x, int y, int val) {
this.x = x;
this.y = y;
this.val = val;
}
}
class PairComparator implements Comparator<Pair> {
public int compare(Pair a, Pair b) {
return a.val - b.val;
}
}
public int kthSmallest(int[][] matrix, int k) {
int[] dx = new int[]{0, 1};
int[] dy = new int[]{1, 0};
int n = matrix.length;
int m = matrix[0].length;
boolean[][] hash = new boolean[n][m];
PriorityQueue<Pair> minHeap = new PriorityQueue<Pair>(k, new PairComparator());
minHeap.add(new Pair(0, 0, matrix[0][0]));
for (int i = 0; i < k - 1; i++) {
Pair cur = minHeap.poll();
for (int j = 0; j < 2; j++) {
int next_x = cur.x + dx[j];
int next_y = cur.y + dy[j];
Pair next_Pair = new Pair(next_x, next_y, 0);
if (next_x < n && next_y < m && !hash[next_x][next_y]) {
hash[next_x][next_y] = true;
next_Pair.val = matrix[next_x][next_y];
minHeap.add(next_Pair);
}
}
}
return minHeap.peek().val;
}
}
Kth Smallest Number in Sorted Matrix
原文:https://www.cnblogs.com/FLAGyuri/p/12078513.html