Leetcode每日一题打卡

    技术2022-07-17  82

    378.有序矩阵中第k小的元素

    原题 不懂就问系列,求解答:为什么这其中得到的left可以保证还是矩阵中的元素? 原题参照官答的理解如下: 利用矩阵同一行右边元素一定小于左边元素以及同一列下方元素一定小于上方元素的特性,可以确定,在矩阵内任意子块里,右下角元素大于这个子块里的每一个元素。这样给定一个值mid,可以在矩阵中查找小于等于mid值的元素的总数——通过函数isLeft()实现。在函数kthSmallest()中,使用二分查找,找到符合条件的值。代码如下:

    class Solution { public: bool isLeft(vector<vector<int>>& matrix,int mid, int k,int n) { int i=n-1; int j=0; int num=0; while(i>=0&&j<n){ if(matrix[i][j]<=mid) { num+=i+1;//加上这一列的元素个数 j++; } else i--; } return num>=k; } int kthSmallest(vector<vector<int>>& matrix, int k) { int n=matrix.size(); int left=matrix[0][0]; int right=matrix[n-1][n-1]; while(left<right) { int mid=left+(right-left)/2; if(isLeft(matrix, mid, k, n)) right=mid; else left=mid+1;//不写+1就死循环了……毕竟返回的是num>=k } return left; } };

    时间复杂度O(nlog(r-l)),空间复杂度O(1)。 以上全部是看官答理解做的,但是,照应开头,不懂就问系列,求解答:为什么这其中得到的left可以保证还是矩阵中的元素?

    Processed: 0.009, SQL: 9