有序矩阵中第k小元素
有序矩阵中第k小元素
题目:
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。
请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素。
看到有序就会想到二分查找,而本题的二分查找十分的有趣。
根据这个矩阵的定义,我们知道,最小的元素是最左上角元素,最大的元素是最左下角元素。
由此我们得到 lo(最小值),hi(最大值)。
在此区间内二分查找第k小的元素,而在本题中,对于任意一个数mid来说,小于它的元素一定分布在矩阵的左上角。
而由此和矩阵有序的性质,我们便有一种时间复杂度为O(N)的在矩阵中查找比mid小的元素的数量的算法。
代码:
class Solution {
public int kthSmallest(int[][] matrix, int k) {
int m = matrix.length;
int n = matrix[0].length;
int min = matrix[0][0];
int max = matrix[m-1][n-1];
return search(min,max,matrix,k);
}
public int search(int lo,int hi,int[][]matrix,int k){
while(lo<hi){
int mid = lo+(hi-lo)/2;
if(helper(matrix,mid)<k){
lo = mid+1;
}else{
hi = mid;
}
}
return lo;
}
public int helper(int[][] matrix,int target){
int m = matrix.length;
int n = matrix[0].length;
int r = m-1;
int l = 0;
int ans = 0;
while(r>=0&&l<n){
if(matrix[r][l]<=target){
ans+=r+1;
l++;
}else{
r--;
}
}
return ans;
}
}

浙公网安备 33010602011771号