一、题目
OJ链接
给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。
你必须找到一个内存复杂度优于 O(n2) 的解决方案。
二、题解
2.1 思路
2.2 源码
public static class Info{
int num;
int near;
public Info(int num, int near) {
this.num = num;
this.near = near;
}
}
public static Info noMoreNum(int[][] matrix,int value){
int near=Integer.MIN_VALUE;
int num=0;
int N= matrix.length;
int M=matrix[0].length;
int row=0;
int col=M-1;
while (row<N&&col>=0){
if(matrix[row][col]<=value){
near=Math.max(near,matrix[row][col]);
num+=col+1;
row++;
} else {
col--;
}
}
return new Info(num ,near);
}
public int kthSmallest(int[][] matrix, int k) {
int N= matrix.length;
int M=matrix[0].length;
int left=matrix[0][0];
int right=matrix[N-1][M-1];
int ans=0;
while (left<=right){
int mid=left+((right-left)/2);
Info info=noMoreNum(matrix,mid);
if(info.num<k){
left=mid+1;
}else {
ans=info.near;
right=mid-1;
}
}
return ans;
}