public int kthSmallest(int[][] matrix, int k) {
int n=matrix.length;
int l=matrix[0][0],r=matrix[n-1][n-1];
while(l<r){
int mid=(l+r)>>1;
int cnt=0;//记录每行<=k的数的数量
for(int i=0,j=n-1;i<n&&j>=0;i++){
while(j>=0&&matrix[i][j]>mid) j--;
cnt+=j+1;
}
if(cnt>=k) r=mid;
else l=mid+1;
}
return l;
}
public int findKthNumber(int m, int n, int k) {
int l=1,r=m*n;
while(l<r){
int mid=(l+r)>>1;
int cnt=0;//记录<=k的数量
for(int i=1;i<=m;i++){
cnt+=Math.min(mid/i,n);
}
//如果[a,b]范围内都是mid,那么cnt会加上这些数量
//如果cnt<k,说明不管k是不是在表中,其位置都比k小
//如果cnt=k,而mid可能不在表中
//如果cnt>k,当mid在表中时,其范围可能占据k位置所以保留mid,不在表中时不是答案
if(cnt>=k) r=mid;
else l=mid+1;
}
return l;
}
public int findKthNumber(int m, int n, int k) { int l=1,r=m*n; while(l<r){ int mid=(l+r)>>1; int cnt=0;//记录<=k的数量 for(int i=1;i<=m;i++){ cnt+=Math.min(mid/i,n); }..