「这是我参与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。
分析:
题目读起来有些绕口,简单概况下,我们求的矩阵中最大整数的元素个数,其实就是操作最多的数。那怎么计算出操作最多的数呢?有两种情况:
operations
没有输入,则无操作的情况下,那矩阵中的每个元素就是最大值,直接返回m*n
- 如果
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
得到两个数的最小值,并返回,最终将得到的最小值相乘。