「每日LeetCode」2021年2月23日

本文最后更新于:2023年3月19日 晚上

Lt598. 范围求和 II

598. 范围求和 II

给定一个初始元素全部为 0,大小为 m*n 的矩阵 M **以及在 **M **上的一系列更新操作。
操作用二维数组表示,其中的每个操作用一个含有两个
正整数  a** 和 b 的数组表示,含义是将所有符合 0 <= i < a 以及 0 <= j < b 的元素 M[i][j] **的值都增加 1
在执行给定的一系列操作后,你需要返回矩阵中含有最大整数的元素个数。
**示例 1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
输入:
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. m 和 n 的范围是  [1,40000]。
  2. a 的范围是 [1,m],b 的范围是 [1,n]。
  3. 操作数目不超过 10000。

思路

矩阵左上角必为(0,0),所以所有矩阵都必定有重叠部分,求所有 ops 分别求得最小的横坐标和纵坐标。这个点和(0,0)构成矩阵必定被重复加过最多次,返回这个矩阵的面积结果即可。

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @param {number} m
* @param {number} n
* @param {number[][]} ops
* @return {number}
*/
var maxCount = function (m, n, ops) {
if (!ops.length) return m * n;
let x = Infinity,
y = Infinity;
for (const op of ops) {
const [i, j] = op;
x = Math.min(i, x);
y = Math.min(j, y);
}
return x * y;
};