【LeetCode】304. 二維區域和檢索 - 矩陣不可變 結題報告 (C++)
阿新 • • 發佈:2018-12-15
原題地址: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); */