class Solution {
public:
vector<vector<int>> rangeAddQueries(int n, vector<vector<int>>& queries) {
}
};
2536. 子矩阵元素加 1
给你一个正整数 n
,表示最初有一个 n x n
、下标从 0 开始的整数矩阵 mat
,矩阵中填满了 0 。
另给你一个二维整数数组 query
。针对每个查询 query[i] = [row1i, col1i, row2i, col2i]
,请你执行下述操作:
(row1i, col1i)
且 右下角 为 (row2i, col2i)
的子矩阵,将子矩阵中的 每个元素 加 1
。也就是给所有满足 row1i <= x <= row2i
和 col1i <= y <= col2i
的 mat[x][y]
加 1
。返回执行完所有操作后得到的矩阵 mat
。
示例 1:
输入:n = 3, queries = [[1,1,2,2],[0,0,1,1]] 输出:[[1,1,0],[1,2,1],[0,1,1]] 解释:上图所展示的分别是:初始矩阵、执行完第一个操作后的矩阵、执行完第二个操作后的矩阵。 - 第一个操作:将左上角为 (1, 1) 且右下角为 (2, 2) 的子矩阵中的每个元素加 1 。 - 第二个操作:将左上角为 (0, 0) 且右下角为 (1, 1) 的子矩阵中的每个元素加 1 。
示例 2:
输入:n = 2, queries = [[0,0,1,1]] 输出:[[1,1],[1,1]] 解释:上图所展示的分别是:初始矩阵、执行完第一个操作后的矩阵。 - 第一个操作:将矩阵中的每个元素加 1 。
提示:
1 <= n <= 500
1 <= queries.length <= 104
0 <= row1i <= row2i < n
0 <= col1i <= col2i < n
原站题解
golang 解法, 执行用时: 152 ms, 内存消耗: 11.2 MB, 提交时间: 2023-01-17 15:12:28
func rangeAddQueries(n int, queries [][]int) [][]int { m := n // 二维差分模板 diff := make([][]int, n+1) for i := range diff { diff[i] = make([]int, m+1) } update := func(r1, c1, r2, c2, x int) { r2++ c2++ diff[r1][c1] += x diff[r1][c2] -= x diff[r2][c1] -= x diff[r2][c2] += x } for _, q := range queries { update(q[0], q[1], q[2], q[3], 1) } // 用二维前缀和复原 ans := make([][]int, n+1) ans[0] = make([]int, m+1) for i, row := range diff[:n] { ans[i+1] = make([]int, m+1) for j, x := range row[:m] { ans[i+1][j+1] = ans[i+1][j] + ans[i][j+1] - ans[i][j] + x } } ans = ans[1:] for i, row := range ans { ans[i] = row[1:] } return ans }
python3 解法, 执行用时: 468 ms, 内存消耗: 35.9 MB, 提交时间: 2023-01-17 15:11:42
# 二维差分 class Solution: def rangeAddQueries(self, n: int, queries: List[List[int]]) -> List[List[int]]: m = n # 二维差分模板 diff = [[0] * (n + 1) for _ in range(m + 1)] for r1, c1, r2, c2 in queries: r2 += 1 c2 += 1 diff[r1][c1] += 1 diff[r1][c2] -= 1 diff[r2][c1] -= 1 diff[r2][c2] += 1 # 用二维前缀和复原 ans = [[0] * (n + 1) for _ in range(m + 1)] for i, row in enumerate(diff[:n]): for j, x in enumerate(row[:m]): ans[i + 1][j + 1] = ans[i + 1][j] + ans[i][j + 1] - ans[i][j] + x del ans[0] for row in ans: del row[0] return ans