返回
每日刷题:巧妙解决矩阵元素和计算,助力LeetCode冲刺!
前端
2023-12-16 20:25:53
2021 年 3 月 2 日,LeetCode 每日一题迎来了一个颇具挑战性的问题:计算二维矩阵内子矩形元素的总和。这道题不仅考验你的编程能力,更能锻炼你的算法思维。让我们一起深入探索,揭开这道题的神秘面纱!
这道题给定了一个二维矩阵,要求你计算其子矩形范围内元素的总和。子矩形的左上角坐标为 (row1, col1),右下角坐标为 (row2, col2)。这里有一些需要注意的条件:
- 你可以假设矩阵不可变。
- 会多次调用 sumRegion 方法。
- 你可以假设 row1 ≤ row2 且 col1 ≤ col2 。
为了解决这个问题,我们需要使用动态规划的思想。首先,我们需要创建一个二维数组 dp,其中 dp[i][j] 表示从 (0, 0) 到 (i, j) 的子矩阵元素的总和。然后,我们可以使用以下公式来计算子矩阵 (row1, col1) 到 (row2, col2) 的元素总和:
sumRegion(row1, col1, row2, col2) = dp[row2][col2] - dp[row1 - 1][col2] - dp[row2][col1 - 1] + dp[row1 - 1][col1 - 1]
这个公式的含义是,我们要从 (0, 0) 到 (row2, col2) 的子矩阵元素总和中减去 (0, 0) 到 (row1 - 1, col2) 和 (0, 0) 到 (row2, col1 - 1) 的子矩阵元素总和,再加上 (0, 0) 到 (row1 - 1, col1 - 1) 的子矩阵元素总和。这样,我们就得到了子矩阵 (row1, col1) 到 (row2, col2) 的元素总和。
以下是这道题的详细代码:
class NumMatrix:
def __init__(self, matrix):
if not matrix:
return
self.dp = [[0] * len(matrix[0]) for _ in range(len(matrix))]
for i in range(len(matrix)):
for j in range(len(matrix[0])):
self.dp[i][j] = matrix[i][j]
if i > 0:
self.dp[i][j] += self.dp[i - 1][j]
if j > 0:
self.dp[i][j] += self.dp[i][j - 1]
if i > 0 and j > 0:
self.dp[i][j] -= self.dp[i - 1][j - 1]
def sumRegion(self, row1, col1, row2, col2):
if row1 < 0 or row2 >= len(self.dp) or col1 < 0 or col2 >= len(self.dp[0]):
return 0
return self.dp[row2][col2] - (self.dp[row1 - 1][col2] if row1 > 0 else 0) - (self.dp[row2][col1 - 1] if col1 > 0 else 0) + (self.dp[row1 - 1][col1 - 1] if row1 > 0 and col1 > 0 else 0)
# 测试用例
matrix = [[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]]
numMatrix = NumMatrix(matrix)
print(numMatrix.sumRegion(2, 1, 4, 3)) # 输出:8
print(numMatrix.sumRegion(1, 1, 2, 2)) # 输出:11
print(numMatrix.sumRegion(1, 2, 2, 4)) # 输出:12
通过这道题的讲解,希望大家能够对动态规划的思想和算法设计有更深入的理解。LeetCode 每日一题是一个很好的刷题平台,可以帮助大家提高编程能力和算法思维。希望大家能够坚持刷题,不断进步!