LeetCode598. 范围求和 II(python)

文章讨论了一个关于矩阵加法的问题,给定一个mxn的矩阵和一系列操作,要求求解加1后矩阵中的最大值个数。最初的解决方案因超时而失败,改进的策略是仅计算加1次数最多的区域,即找到操作中x和y的最小边界,其乘积即为最大值的个数。对于没有操作的情况,返回矩阵的总大小。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

示例
在这里插入图片描述

思路

最简单的思路就是把这个二维数组,也就是加完1之后的矩阵计算出来,在求解最大值的个数

class Solution:
    def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
        if not bool(ops):
            return m * n
        elif len(ops) == 1:
            return ops[0][1] * ops[0][0]
        M = [[0 for i in range(n)] for j in range(m)]
        for op in ops:
            ai, bi = op[0], op[1]
            for x in range(m):
                for y in range(n):
                    if x < ai and y < bi:
                        M[x][y] += 1 
        res = sum(M, [])
        return res.count(max(res))

很可惜,超时了,后面的数字太大了 ,

那么有没有一种只求答案不计算这个数组的方法呢

如果每个x和y在ops[i][0]和ops[i][1]范围内都要加1,
那么其中的最小值就是加1次数最多的,
将ops变成两个分别存放x,y的数组,

res = sum(ops, []) #将ops改为一维数组
res[::2] #索引为奇数,为x的数组
res[1::2] #索引为偶数,为y的数组

分别求出x和y的最小值,

min(res[::2]min(res[1::2])

x_min * y_min就是加1次数最多的矩阵,
x_min * y_min 的值就是最大值的个数

min(res[1::2]) * min(res[::2])

当然还要考虑到ops为空的情况,
每个值都没有+1 ,
所以直接返回 x_min * y_min

if not bool(ops):
            return m * n

题解

class Solution:
    def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
        if not bool(ops):
            return m * n
        else:
            res = sum(ops, [])
            return min(res[1::2]) * min(res[::2])


https://leetcode.cn/problems/range-addition-ii/solutions/2162215/fan-wei-qiu-he-by-funny-shavvpwo-i3xg/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值