如何在有序矩阵中找第k大的数?
378. 有序矩阵中第K小的元素 题目链接
一个矩阵从左到右递增、从上到下递增怎么找第k大的数?
1、 把矩阵变成一维然后排个序
2、 合并有序数组那样合并
3、 二分
主要说二分怎么求。
二分一个第k大是多少。
check的时候,也就是判断有没有k个数大于等于mid
比mid小的肯定在是左上角一些元素。
比如这样一个矩阵:
如果mid是12的话:
就有左上角这样一些:
这样的话就可以用n+n的时间快速统计出来有多少个数大于等于mid!!
(明明可以暴力的)
int sum = 0;
int j = 0;
int i = n - 1;
while(i >= 0 && j < n)
{
if(a[i][j] > x)
i -- ;
else
{
sum += i + 1;
j ++ ;
}
}
然后用二分来写就好了
代码:
class Solution {
public:
int n;
int flag;
bool pd(int x,vector<vector<int>>& a)
{
int sum = 0;
int j = 0;
int i = n - 1;
while(i >= 0 && j < n)
{
if(a[i][j] > x)
i -- ;
else
{
sum += i + 1;
j ++ ;
}
}
return sum >= flag;
}
int kthSmallest(vector<vector<int>>& a, int k) {
flag = k;
n = a.size();
in