Leetcode 378 - Kth Smallest Element in a Sorted Matrix(二分+杨氏矩阵)

题意

求杨氏矩阵内的第k大元素。

思路

我们首先二分一下第k大元素,假设为x。然后只需要求x在杨氏矩阵内的排名就好(有多少个元素比x小)。

求元素x在杨氏矩阵内的排名,时间复杂度 O(m+n)

  1. 初始order = 0, 从右上角 a[i,j] 开始。
  2. xa[i,j]:i++,order+=j+1 (加上这一行所有 x 的个数)
  3. x<a[i,j]:j

时间复杂度 O((m+n)(log(a[m1,n1]a[0,0])))

代码

class Solution {
public:
    vector<vector<int>> a;
    int rank(int x) {
        int order = 0, i = 0, j = a[0].size() - 1;
        while (i < a.size() && j >= 0) {
            if (x >= a[i][j]) order += j + 1, i++;
            else j--;
        }
        return order;
    }

    int kthSmallest(vector<vector<int>>& matrix, int k) {
        a = matrix;
        int m = a.size(), n = a[0].size();
        int L = a[0][0], R = a[m - 1][n - 1], M;
        while (L < R) {
            M = L + (R - L >> 1);
            if (rank(M) < k) L = M + 1;
            else R = M;
        }
        return R;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值