找矩阵第k大的数、力扣 1508. 子数组和排序后的区间和

如何在有序矩阵中找第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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值