【数组】力扣598:范围求和Ⅱ

给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时, M[x][y] 应该加 1。
在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。
示例:

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

思路:
由于每次都是对 0 ≤ i < a 和 0 ≤ j < b 进行操作,因此每次操作都会包含点 (0, 0),最后的最大值一定出现在位置 (0, 0) 上。每个范围都是从 0 开始,所以,我们只需要求得最小的行和最小的列,两者相乘即可。
不难发现,在所有的 ops[i] 中的横纵坐标 (x, y) 与左上角 (0, 0) 形成的区域面积可确保被每次操作覆盖,x * y 即是答案。
因此,我们的任务即为找出矩阵中所有满足要求的次数恰好等于操作次数的位置。假设操作次数为 k,那么 (i, j) 需要满足:
image
等价于:
image
所以只需要求出 a 和 b 中的最小值,最终ans = mina * minb。

class Solution:
    def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
        mina, minb = m, n
        for a, b in ops:
            mina = min(mina, a)
            minb = min(minb, b)
        return mina * minb

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/range-addition-ii/solution/fan-wei-qiu-he-ii-by-leetcode-solution-kcxq/

时间复杂度:O(k),其中 k 是数组 ops 的长度。
空间复杂度:O(1)。

一行代码:小技巧对于多维矩阵,列转行用zip函数

class Solution:
    def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
        return min(list(zip(*ops))[0])*min(list(zip(*ops))[1]) if ops else m*n

作者:Jam007
链接:https://leetcode-cn.com/problems/range-addition-ii/solution/yi-xing-dai-ma-xing-neng-da-dao-100-by-j-3393/
posted @   Vonos  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示