给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
请注意,它是排序后的第k小元素,而不是第k个元素。
示例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,
返回 13。
public boolean guess(int[][] matrix, int mid, int k, int n) {
int sum1 = 0;
for(int i = 0; i < n; i++) {
int low = 0;
int high = n - 1;
int ans = -1;
while(low <= high) {
int m = (low + high) / 2;
if (matrix[i][m] < mid) {
ans = m;
low = m + 1;
} else {
high = m - 1;
}
}
sum1 += (ans + 1);
}
int sum2 = 0;
for(int i = 0; i < n; i++) {
int low = 0;
int high = n - 1;
int ans = -1;
while(low <= high) {
int m = (low + high) / 2;
if (matrix[i][m] <= mid) {
ans = m;
low = m + 1;
} else {
high = m - 1;
}
}
sum2 += (ans + 1);
}
return k > sum1;
}
public int kthSmallest(int[][] matrix, int k) {
int n = matrix.length;
int low = matrix[0][0];
int high = matrix[n-1][n-1];
int ans = 0;
while (low <= high) {
int mid = (int) ((long) low + high) / 2;
if (guess(matrix, mid, k, n)) {
ans = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}
return ans;
}