leecode 打卡-范围求和 II

137 阅读2分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」。

题目需求如下:

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

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

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

示例1:

输入: 
m = 3, n = 3
operations = [[2,2],[3,3]]
输出: 4
解释: 
初始状态, M = 
[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]]

执行完操作 [2,2] 后, M = 
[[1, 1, 0],
 [1, 1, 0],
 [0, 0, 0]]

执行完操作 [3,3] 后, M = 
[[2, 2, 1],
 [2, 2, 1],
 [1, 1, 1]]

M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4

分析:

题目读起来有些绕口,简单概况下,我们求的矩阵中最大整数的元素个数,其实就是操作最多的数。那怎么计算出操作最多的数呢?有两种情况:

  1. operations 没有输入,则无操作的情况下,那矩阵中的每个元素就是最大值,直接返回 m*n
  2. 如果 operations 有输入,那就计算共同被 operations 操作到的数。比如 operations 输入为 [[2,2],[3,3] 时,那 [3,3] 操作到的数肯定包含 [2,2] 所操作到的数,这样一来,是不是可以理解了,即 [2,2] 就是操作最多的数。那想要求出 [2,2] 中最大整数的元素个数,即用 2*2 即可。

解法1:找到交集

var maxCount = function(m, n, ops) {
    let mina = m, minb = n;
    for (const op of ops) {
        mina = Math.min(mina, op[0]);
        minb = Math.min(minb, op[1]);
    }
    return mina * minb;
};

代码解读:

maxCount 函数中,接收 m*n 大小的矩阵,遍历操作的二维数组 ops,如果 ops 为空,则不进入循环,直接返回 m*n ,即上面分析的时候提到的第一种情况。如果 ops 不为空的话,则进入循环,通过 Math.min 得到两个数的最小值,并返回,最终将得到的最小值相乘。