每日leetcode-数组-598. 范围求和 II

分类:数组-二维数组及滚动数组

 

题目描述:

给定一个初始元素全部为 0,大小为 m*n 的矩阵 M 以及在 M 上的一系列更新操作。

操作用二维数组表示,其中的每个操作用一个含有两个正整数 a 和 b 的数组表示,含义是将所有符合 0 <= i < a 以及 0 <= j < b的元素 M[i][j] 的值都增加 1。

在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。

 

解题思路:

每次操作都是左上角区域从(0, 0)到(a, b)的矩形,必定重叠,所以找最小的a乘最小的b就行。

第一时间想到的是暴力解法,创建数组把操作执行一遍,再遍历一次找出最大的值个数,发现内存超出,于是乎换个思路
仔细看一下发现,操作的范围是一个矩形,可以把操作看成一个个矩形,要找出最大值个数,其实就是找出所有操作矩形叠加的区域,因为所有操作都加了叠加区域的数值
因此我们只要遍历操作数组,找到m和n的最小值(就是重叠区域)相乘就是矩形面积(既最大值个数)
需要注意的是如果操作数组为空,那么空数组的最大值就是0,那么最大值个数就是m*n

class Solution:
    def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
                #返回最小值的乘积 或者 全0返回m * n
        return min([a[0] for a in ops]) * min([a[1] for a in ops]) if ops else m * n

 

复杂度分析

  • 时间复杂度:O(x)O(x)。只需要遍历所有操作一次,xx 是操作的数目。

  • 空间复杂度:O(1)O(1)。不需要额外的数组空间。

 
posted @ 2021-05-17 21:48  LLLLgR  阅读(57)  评论(0编辑  收藏  举报