1、题目描述
输入一个2维矩阵,每行每列都是升序的。
输入k,返回矩阵中第k小的元素。
2、思路
二分查找。
矩阵中最小元素在左上角l,最大元素在右上角r。
当l<r时,进行下述循环:
mid为l与r的中值,找到矩阵中小于或等于mid的元素个数cnt。
如果cnt小于k,则l = mid +1;
否则,r=mid。
3、代码
int kthSmallest(vector<vector<int>>& matrix, int k) {
int n = matrix.size();
int l = matrix[0][0];
int r = matrix[n-1][n-1];
while(l<r){
int mid = l+(r-l)/2;
int cnt=0,j=n-1;
for(int i=0;i<n;i++){
while(j>=0&&matrix[i][j]>mid)j--;
cnt+=(j+1);
}
if(cnt<k) l=mid+1;
else r = mid;
}
return l;
}