1. 程式人生 > >【LeetCode】304. 二維區域和檢索 - 矩陣不可變 結題報告 (C++)

【LeetCode】304. 二維區域和檢索 - 矩陣不可變 結題報告 (C++)

原題地址:https://leetcode-cn.com/problems/range-sum-query-2d-immutable/submissions/

題目描述:

給定一個二維矩陣,計算其子矩形範圍內元素的總和,該子矩陣的左上角為 (row1, col1) ,右下角為 (row2, col2)。

Range Sum Query 2D
上圖子矩陣左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),該子矩形內元素的總和為 8。

示例:

給定 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]
]

sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12
說明:

你可以假設矩陣不可變。
會多次呼叫 sumRegion 方法。
你可以假設 row1 ≤ row2 且 col1 ≤ col2。

 

解題方案:

動態規劃的題型,遞推公式還是比較明顯的。

程式碼:

class NumMatrix {
public:
    vector<vector<int>> dp;
    NumMatrix(vector<vector<int>> matrix) {
        //cout << matrix[0].size();
        if(matrix.size()){
            dp = vector<vector<int>>(matrix.size(), vector<int>(matrix[0].size(), 0));
            dp[0][0] = matrix[0][0];
            for(int i = 1; i < matrix[0].size(); i ++)
                dp[0][i] = dp[0][i - 1] + matrix[0][i];
            for(int i = 1; i < matrix.size(); i ++)
                dp[i][0] = dp[i - 1][0] + matrix[i][0];
            for(int i = 1; i < matrix.size(); i ++)
                for(int j = 1; j < matrix[0].size(); j ++)
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + matrix[i][j];
        }
    }
    
    int sumRegion(int row1, int col1, int row2, int col2) {
        int ans = dp[row2][col2];
        if(row1)
            ans -= dp[row1 - 1][col2];
        if(col1)
            ans -= dp[row2][col1 - 1];
        if(row1 && col1)
            ans += dp[row1- 1][col1 - 1];
        return ans;
    }
};

/**
 * Your NumMatrix object will be instantiated and called as such:
 * NumMatrix obj = new NumMatrix(matrix);
 * int param_1 = obj.sumRegion(row1,col1,row2,col2);
 */