leetcode (力扣) 598. 范围求和 II (暴力法)(数学法)

题目在这:https://leetcode-cn.com/problems/range-addition-ii/

法一(暴力法):

直接比较容易理解的思路,暴力法。 用于理解题目,但提交超时。
三重循环,第一重遍历需要操作的数组,后面两层遍历W矩阵中的数。

完整代码

在这里插入代码片class Solution:
    def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
        M = [[0 for j in range(n)] for k in range(m)]
        res = 0
        print(M)
        for i in ops:
            a = i[0]
            b = i[1]
            for p in range(m):
                for q in range(n):
                    if 0 <= p < a and 0 <= q < b:
                        M[p][q] +=1
                        res = max(res,M[p][q])
        print(M)
        print(res)
        ans = 0

        for b in M:
            ans += b.count(res)

        print(ans)
        return ans

法二(数学法):

题中要求整个M矩阵操作完成之后的最大的数出现的次数。
我们使用例子 :
m = 3, n = 3
operations = [[2,2],[3,3]]
第一次操作 从0到2行 从0到2列的数加1,
第二次操作 从0到3行 从0到3列的数加1.
不难发现,最大的数肯定在 0-2行和0-2列的重叠区域中。因为2-3行2-3列只有在第二次操作中才加了1,所以肯定不是最大的数。

所以,每次都在有加1操作的区间,一定是所有操作区间中最小的区间。
就像下面这张图,只有蓝色区域是最小的全部重合区域。

在这里插入图片描述
只需要找到全部操作中的行最小值和列最小值,两者相乘即可得到答案。

完整代码

class Solution:
    def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
        if len(ops) == 0:
            return m * n
        x = ops[0][0]
        y = ops[0][1]
        for r, c in ops:
            x = min(x, r)
            y = min(y, c)
        print(y*x)
        return x *y```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值