LeetCode——有序矩阵中第K小的元素

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

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

返回 13。

public boolean guess(int[][] matrix, int mid, int k, int n) {

        int sum1 = 0;
        for(int i = 0; i < n; i++) {
            int low = 0;
            int high = n - 1;
            int ans = -1;
            while(low <= high) {
                int m = (low + high) / 2;
                if (matrix[i][m] < mid) {
                    ans = m;
                    low = m + 1;
                } else {
                    high = m - 1;
                }
            }
            sum1 += (ans + 1);
        }

        int sum2 = 0;
        for(int i = 0; i < n; i++) {
            int low = 0;
            int high = n - 1;
            int ans = -1;
            while(low <= high) {
                int m = (low + high) / 2;
                if (matrix[i][m] <= mid) {
                    ans = m;
                    low = m + 1;
                } else {
                    high = m - 1;
                }
            }
            sum2 += (ans + 1);
        }
        return k > sum1;
    }



    public int kthSmallest(int[][] matrix, int k) {
        int n = matrix.length;
        int low = matrix[0][0];
        int high = matrix[n-1][n-1];
        int ans = 0;
        while (low <= high) {
            int mid = (int) ((long) low + high) / 2;
            if (guess(matrix, mid, k, n)) {
                ans = mid;
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return ans;
    }

猜你喜欢

转载自blog.csdn.net/reuxfhc/article/details/80378173
今日推荐