zoukankan      html  css  js  c++  java
  • 每日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)。不需要额外的数组空间。

     
  • 相关阅读:
    动态数组的实现案例
    随机验证码实现案例
    wince下的CPU和内存占用率计算
    RT-Thread--时间管理
    RT-Thread--线程管理
    RT-Thread--内核基础
    RT-Thread--简介
    Git基本操作
    STM32F103/429串口IAP+Ymodem升级
    KEIL_MDK生成Bin文件
  • 原文地址:https://www.cnblogs.com/LLLLgR/p/14778762.html
Copyright © 2011-2022 走看看