Kth Smallest Element in a Sorted Matrix
public class Solution {
/**
* @param matrix: List[List[int]]
* @param k: a integer
* @return: return an integer
*/
public int kthSmallest(int[][] matrix, int k) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return -1;
int m = matrix.length;
int n = matrix[0].length;
int low = matrix[0][0];
int high = matrix[m - 1][n - 1];
while (low + 1 < high) {
int mid = findMid(low, high);
int cnt = helper(matrix, mid);
if (cnt >= k) { //mid 有可能在矩阵中并不存在
high = mid;
} else {
low = mid;
}
}
return helper(matrix, low) >= k ? low : high;
}
private int findMid(int x, int y) { //在正负不确定的情况下找中间数的套路
if (x > 0 || y < 0) {
return x + (y - x) / 2; //同号
} else {
return x + y; //异号
}
}
private int helper(int[][] matrix, int val) {
int cnt = 0;
int m = matrix.length;
int n = matrix[0].length;
int i = 0, j = n - 1;
while (i < m && j >= 0) {
if (matrix[i][j] <= val) {
cnt += j + 1;
i++;
} else {
j--;
}
}
return cnt;
}
}
最后更新于
这有帮助吗?