一.数组(17)598. 范围求和 II

598. 范围求和 II

给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时, M[x][y] 应该加 1。

在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。

示例 1:

输入: m = 3, n = 3,ops = [[2,2],[3,3]]
输出: 4
解释: M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。
示例 2:

输入: m = 3, n = 3, ops = [[2,2],[3,3],[3,3],[3,3],[2,2],[3,3],[3,3],[3,3],[2,2],[3,3],[3,3],[3,3]]
输出: 4
示例 3:

输入: m = 3, n = 3, ops = []
输出: 9
 

提示:

1 <= m, n <= 4 * 104
0 <= ops.length <= 104
ops[i].length == 2
1 <= ai <= m
1 <= bi <= n

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/range-addition-ii

 

官方题解:

方法一:维护所有操作的交集
思路与算法

对于每一次操作,给定(a,b),我们会将矩阵中所有满足0≤i<a 以及0≤j<b 的位置 (i, j)全部加上 1。由于 a, b 均为正整数,那么 (0,0) 总是满足上述条件,并且最终位置 (0,0) 的值就等于操作的次数。

因此,我们的任务即为找出矩阵中所有满足要求的次数恰好等于操作次数的位置。假设操作次数为 k,那么 (i, j)需要满足:


 

等价于:

 

代码如下:

func maxCount(m int, n int, ops [][]int) int {
   mina, minb := m, n//初始化为最大值
   for _, op := range ops{//遍历ops数组
   //最后,mina为最小行数,minb为最小列数
        mina = min(mina, op[0])
        minb = min(minb, op[1])
   }
    return mina * minb
}

func min(a, b int)int{
       if a < b{
           return a
       }else{
           return b
       }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值