有序矩阵中第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;
    }
}
posted @ 2020-07-03 10:23  jackandtwo  阅读(262)  评论(0)    收藏  举报