二维区间和查询(前缀和表)
2D Range Sum via Prefix Table
开始编码风控看板把整个交易宇宙铺成一个 R × C 的热力图——行是行业,列是 5 分钟时间桶,grid[i][j] 是带正负号的敞口(正数 = 多头,负数 = 空头)。看板要反复回答同一种问题:*「这个矩形块里的净敞口是多少?」* 用户实时拖拽矩形大小,于是系统在一张固定网格上要回答成千上万次区间和查询。每次都现场把矩形里的格子加一遍,单次没问题,量大了就跑不动。
请实现 solution(grid: list[list[int]], queries: list[list[int]]) -> list[int]。每个查询 [r1, c1, r2, c2] 表示一个两端都闭合的矩形,按输入顺序返回每个矩形的和。边界:空网格(R == 0 或 C == 0),若 queries 也为空则返回 [],否则抛出 ValueError(对空网格查矩形和无法定义)。单格查询 [r, c, r, c] 返回 grid[r][c]。
示例:solution([[3, 0, 1, 4, 2], [5, 6, 3, 2, 1], [1, 2, 0, 1, 5], [4, 1, 0, 1, 7], [1, 0, 3, 0, 5]], [[2, 1, 4, 3], [1, 1, 2, 2], [1, 2, 2, 4]]) 应返回 [8, 11, 12]。第一个矩形覆盖第 2–4 行、第 1–3 列,单元格累加得 8;第二个矩形是第 1–2 行、第 1–2 列,6+3+2+0 = 11;第三个矩形是第 1–2 行、第 2–4 列,3+2+1+0+1+5 = 12。
二维前缀和表把所有重活提前做完。定义 P[i][j] = grid[0..i-1][0..j-1] 的累加和,并取 P[0][*] = P[*][0] = 0。递推式 P[i+1][j+1] = P[i][j+1] + P[i+1][j] − P[i][j] + grid[i][j] 本身就是一次小型容斥(−P[i][j] 抵消了被左上角子矩形重复计数的部分)。预处理 O(R·C) 时间与空间,之后每次查询变为四次查表:P[r2+1][c2+1] − P[r1][c2+1] − P[r2+1][c1] + P[r1][c1]。总成本 O(R·C + Q),对比朴素重算的 O(Q·R·C)。这是一维前缀和在二维上的自然推广,也是 LeetCode 304 的标准解法。
约束条件
- 0 ≤ R, C ≤ 500(网格 `R × C`,任一维度可以为 0)
- 0 ≤ len(queries) ≤ 10⁴
- −10⁴ ≤ grid[i][j] ≤ 10⁴
- 每个查询为 `[r1, c1, r2, c2]`,满足 0 ≤ r1 ≤ r2 < R,0 ≤ c1 ≤ c2 < C(两端都闭合)
- 空网格(R == 0 或 C == 0):若 queries 也为空返回 `[]`;否则抛出 `ValueError`
样例
Case 1 · LC 304 example — three rectangles
输入: [[[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,0,1,7],[1,0,3,0,5]],[[2,1,4,3],[1,1,2,2],[1,2,2,4]]]
期望: [8,11,12]
经典 LC 304 示例。建好 (R+1)×(C+1) 的前缀和表后,每个矩形通过四次查表即可:P[r2+1][c2+1] − P[r1][c2+1] − P[r2+1][c1] + P[r1][c1]。三个矩形分别得 8、11、12。
Case 2 · single-cell query — returns the cell value
输入: [[[7]],[[0,0,0,0]]]
期望: [7]
单格查询 r1=r2 且 c1=c2,结果就是 grid[r][c]。容斥公式仍然成立:P[1][1] − P[0][1] − P[1][0] + P[0][0] = 7 − 0 − 0 + 0 = 7。
Case 3 · full-grid sum on 2x2
输入: [[[1,2],[3,4]],[[0,0,1,1]]]
期望: [10]
整张网格求和:1+2+3+4 = 10。当矩形覆盖全部时,r1=c1=0,公式退化为 P[R][C],即整网格累加和。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · LC 304 example — three rectangles
输入: [[[3,0,1,4,2],[5,6,3,2,1],[1,2,0,1,5],[4,1,0,1,7],[1,0,3,0,5]],[[2,1,4,3],[1,1,2,2],[1,2,2,4]]]
期望: [8,11,12]
经典 LC 304 示例。建好 (R+1)×(C+1) 的前缀和表后,每个矩形通过四次查表即可:P[r2+1][c2+1] − P[r1][c2+1] − P[r2+1][c1] + P[r1][c1]。三个矩形分别得 8、11、12。
Case 2 · single-cell query — returns the cell value
输入: [[[7]],[[0,0,0,0]]]
期望: [7]
单格查询 r1=r2 且 c1=c2,结果就是 grid[r][c]。容斥公式仍然成立:P[1][1] − P[0][1] − P[1][0] + P[0][0] = 7 − 0 − 0 + 0 = 7。
Case 3 · full-grid sum on 2x2
输入: [[[1,2],[3,4]],[[0,0,1,1]]]
期望: [10]
整张网格求和:1+2+3+4 = 10。当矩形覆盖全部时,r1=c1=0,公式退化为 P[R][C],即整网格累加和。