378. Kth Smallest Element in a Sorted Matrix

题目:Kth Smallest Element in a Sorted Matrix

原题链接:https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/

Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix.

Note that it is the kth smallest element in the sorted order, not the kth distinct element.

Example:

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

return 13.
Note:
You may assume k is always valid, 1 ≤ k ≤ n2.

给定一个n * n 矩阵,保证每行、每列都是递增顺序,找出矩阵所有元素中第 k 小的元素。题目保证 k 是合法的。

例:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8, 那么第8小的元素就是13.

和找一维数组中第 k 小的元素类似,只不过这次换成了二维数组,不过思想还是差不多的。
可以用二分的思想来解决,初始选择矩阵的左上角和右下角的元素作为下限 low 和上限 high ,取它们的平均值mid,然后按照每一行扫描数组,累计不大于mid的所有元素的个数,然后和 k 比较,如果比 k 大,那么令 high = mid, 否则令 low = mid + 1,循环一直到low >= high停止,这个时候 low 的值就是第 k 小的元素。

代码如下:

class Solution {
public:
    int kthSmallest(vector<vector<int>>& matrix, int k) {
        int len = matrix.size();
        int low = matrix[0][0], high = matrix[len - 1][len - 1];
        while(low < high) {
            int mid = (low + high) >> 1;
            int cou = 0, j = len - 1;
            for (int i = 0; i < len; ++i) {
                while(j >= 0 && matrix[i][j] > mid) j--;
                cou += j + 1;
            }
            if (cou < k) {
                low = mid + 1;
            } else {
                high = mid;
            }
        }
        return low;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值