【Leetcode 每日一题】598. 区间加法 II
问题背景
给你一个
m
×
n
m \times n
m×n 的矩阵
M
M
M 和一个操作数组
o
p
op
op。矩阵初始化时所有的单元格都为
0
0
0。
o
p
s
[
i
]
=
[
a
i
,
b
i
]
ops[i] = [a_i, b_i]
ops[i]=[ai,bi] 意味着当所有的
0
≤
x
<
a
i
0 \le x \lt a_i
0≤x<ai 和
0
≤
y
<
b
i
0 \le y \lt b_i
0≤y<bi 时,
M
[
x
]
[
y
]
M[x][y]
M[x][y] 应该加
1
1
1。
在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。
数据约束
- 1 ≤ m , n ≤ 4 × 1 0 4 1 \le m, n \le 4 \times 10 ^ 4 1≤m,n≤4×104
- 0 ≤ o p s . l e n g t h ≤ 1 0 4 0 \le ops.length \le 10 ^ 4 0≤ops.length≤104
- o p s [ i ] . l e n g t h = 2 ops[i].length = 2 ops[i].length=2
- 1 ≤ a i ≤ m 1 \le a_i \le m 1≤ai≤m
- 1 ≤ b i ≤ n 1 \le b_i \le n 1≤bi≤n
解题过程
自己在倒腾二维前缀和数组,实际上每次操作都可以看做在原来的基础上重叠一个新矩形,所有矩形的左上角固定。
这样一来,最大整数一定是重叠次数最多的交集部分,找到它的右下角就可以计算出结果了。
具体实现
class Solution {
public int maxCount(int m, int n, int[][] ops) {
int minX = m;
int minY = n;
for (int[] op : ops) {
minX = Math.min(minX, op[0]);
minY = Math.min(minY, op[1]);
}
return minX * minY;
}
}