返回

每日刷题:巧妙解决矩阵元素和计算,助力LeetCode冲刺!

前端

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 每日一题是一个很好的刷题平台,可以帮助大家提高编程能力和算法思维。希望大家能够坚持刷题,不断进步!