leetcode 【高级】Kth Smallest Element in a Sorted Matrix Java

我的梦境 提交于 2020-01-23 18:32:36

题干

给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
请注意,它是排序后的第k小元素,而不是第k个元素。
示例:

matrix = [
   [ 1,  5,  9],
   [10, 11, 13],
   [12, 13, 15]
],
k = 8,

返回 13

说明:
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。

想法

最小堆,遍历每一层的数然后放到最小堆
堆顶弹出 接着遍历第二行
第k次弹出就是

2.非常规的二分法
若采用Binary Search, 先猜一个值,这个值是由最小值matrix[0][0]和最大值matrix[n-1][n-1]求mid得来.

然后算下小于等于这个mid的matrix元素个数,若是个数小于k, 就在mid到最大值之间再猜一个新的mid. 直到l 不再小于 r.

Time Complexity: O(nlog(matrix[n-1][n-1] - matrix[0][0])), 每次lowerThanMidCount用时O(n).

Space: O(1).

Java代码

public class Solution {
    public int kthSmallest(int[][] matrix, int k) {
        int n = matrix.length;
        int l = matrix[0][0];
        int r = matrix[n-1][n-1];
        while(l < r){
            int mid = l + (r-l)/2;
            int temp = lowerThanMidCount(matrix, mid);
            if(temp < k){
                l = mid+1;
            }else{
                r = mid;
            }
        }
        return l;
    }
    
    private int lowerThanMidCount(int [][] matrix, int mid){
        int n = matrix.length;
        int i = 0;
        int j = n-1;
        int count = 0;
        
        while(i<n && j>=0){
            if(matrix[i][j] <= mid){
                i++;
                count += j+1;
            }else{
                j--;
            }
        }
        return count;
    }
}


参考

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!