598. 区间加法 II
题目描述
给你一个 m x n 的矩阵 M 和一个操作数组 op 。矩阵初始化时所有的单元格都为 0 。ops[i] = [ai, bi] 意味着当所有的 0 <= x < ai 和 0 <= y < bi 时, M[x][y] 应该加 1。
在 执行完所有操作后 ,计算并返回 矩阵中最大整数的个数 。
示例 1:
输入: m = 3, n = 3,ops = [[2,2],[3,3]] 输出: 4 解释: M 中最大的整数是 2, 而且 M 中有4个值为2的元素。因此返回 4。
示例 2:
输入: m = 3, n = 3, ops = [[2,2],[3,3],[3,3],[3,3],[2,2],[3,3],[3,3],[3,3],[2,2],[3,3],[3,3],[3,3]] 输出: 4
示例 3:
输入: m = 3, n = 3, ops = [] 输出: 9
提示:
1 <= m, n <= 4 * 1040 <= ops.length <= 104ops[i].length == 21 <= ai <= m1 <= bi <= n
解法
方法一:脑筋急转弯
思考
每次给左上角子矩阵加一,最后的最大值等于操作次数,其出现次数等于所有操作子矩阵的交集面积。子矩阵都从 \((0,0)\) 出发,交集就是最小的 \(a\) 与最小的 \(b\)。
扫一遍操作取 \(\min a_i\) 与 \(\min b_i\),乘积即答案。无需真正建 \(m \times n\) 的差分数组。
我们注意到,所有操作子矩阵的交集就是最终的最大整数所在的子矩阵,并且每个操作子矩阵都是从左上角 \((0, 0)\) 开始的,因此,我们遍历所有操作子矩阵,求出行数和列数的最小值,最后返回这两个值的乘积即可。
注意,如果操作数组为空,那么矩阵中的最大整数个数就是 \(m \times n\)。
时间复杂度 \(O(k)\),其中 \(k\) 是操作数组 \(\textit{ops}\) 的长度。空间复杂度 \(O(1)\)。
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
