返回
LeetCode0304题二维区域和检索 - 矩阵不可变:前缀和暴力到极致的解法
前端
2024-01-19 18:40:18
前言
昨天做了[LeetCode0303题区域和检索 - 数组不可变] | 刷题打卡和[LeetCode1200. 最小绝对差] | 刷题打卡两道题,303题是昨天的每日一题考察的是前缀和,果然今天的每日一题也是,其实大家从每天的每日一题点进相似题目,如果看到官方题解更新了,那这道题也八九不离十了(说不定就是原题)。不过按照我的刷题顺序,304题倒是比303题先接触到,所以我就先做了304题。
题目
给你一个 m x n 的矩阵 matrix ,以及一个查询列表 queries ,其中每个查询都用一个四元组 [row1, col1, row2, col2] 表示,你需要返回在从左上角 (row1, col1) 到右下角 (row2, col2) 的子矩阵中所有元素的和。
这块代码就可以完成题目所要求的功能:
class NumMatrix:
def __init__(self, matrix: List[List[int]]):
"""
:type matrix: List[List[int]]
"""
if not matrix:
return
m, n = len(matrix), len(matrix[0])
# 创建二维前缀和
preSum = [[0 for _ in range(n + 1)] for _ in range(m + 1)]
# 对每一行做前缀和
for i in range(1, m + 1):
for j in range(1, n + 1):
preSum[i][j] = matrix[i - 1][j - 1] + preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1]
def sumRegion(self, row1: int, col1: int, row2: int, col2: int) -> int:
"""
:type row1: int
:type col1: int
:type row2: int
:type col2: int
:rtype: int
"""
return preSum[row2 + 1][col2 + 1] - preSum[row1][col2 + 1] - preSum[row2 + 1][col1] + preSum[row1][col1]
# Your NumMatrix object will be instantiated and called as such:
# obj = NumMatrix(matrix)
# param_1 = obj.sumRegion(row1, col1, row2, col2)
总结
这道题是LeetCode0303题区域和检索 - 数组不可变的二维扩展,仍然是使用前缀和的思想。前缀和是一种非常有用的数据结构,可以用来快速计算子数组或子矩阵的和。如果你还没有掌握前缀和,建议你学习一下。