598 范围求和 II

本文最后更新于:2021年3月26日 下午

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

操作用二维数组表示,其中的每个操作用一个含有两个正整数 ab 的数组表示,含义是将所有符合 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
18
19
20
21
输入: 
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。

Solution

  • 找最小重叠子区域的大小
  • 由于每次都从左上角覆盖操作,故找出最小的重叠操作区域
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# @lc code=start
class Solution:
def maxCount(self, m: int, n: int, ops: List[List[int]]) -> int:
if not ops:
return m * n
min_a, min_b = -1, -1
for op in ops:
a, b = op[0], op[1]
if min_a==-1 or a < min_a:
min_a = a
if min_b==-1 or b < min_b:
min_b = b
return min_a * min_b

# @lc code=end

cpp

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int maxCount(int m, int n, vector<vector<int>>& ops) {
if (ops.size() == 0) return m * n;
int min_m = m, min_n = n;
for (auto& v : ops) {
min_m = min(min_m, v[0]);
min_n = min(min_n, v[1]);
}
return min_m * min_n;
}
};

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!