【数组】力扣598:范围求和Ⅱ
给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时, M[x][y] 应该加 1。
在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。
示例:
输入: 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) 需要满足:
等价于:
所以只需要求出 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/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理