题目描述:
给定一个二维矩阵
matrix,以下类型的多个请求:
计算其子矩形范围内元素的总和,该子矩阵的 左上角 为
(row1, col1),右下角 为(row2, col2)。实现
NumMatrix类:
NumMatrix(int[][] matrix)给定整数矩阵matrix进行初始化
int sumRegion(int row1, int col1, int row2, int col2)返回 左上角(row1, col1)、右下角(row2, col2)所描述的子矩阵的元素 总和 。
示例:
输入:
["NumMatrix","sumRegion","sumRegion","sumRegion"]
[[[[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]]],[2,1,4,3],[1,1,2,2],[1,2,2,4]]
输出:
[null, 8, 11, 12]解释:
NumMatrix numMatrix = new NumMatrix([[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.sumRegion(2, 1, 4, 3); // return 8 (红色矩形框的元素总和)
numMatrix.sumRegion(1, 1, 2, 2); // return 11 (绿色矩形框的元素总和)
numMatrix.sumRegion(1, 2, 2, 4); // return 12 (蓝色矩形框的元素总和)
解决方案:
1、先用2x2矩阵模拟-->找出一般规律
2、先做出求和矩阵:减去红色重复计算部分
用动态规划来计算 矩阵:当前坐标的数字 ==上面长方形的数字和 + 左边长方形的数字和 -上面长方形和左边长方形重合面积(即左上一格的长方形)中的数字和。
3、矩阵检索+查找和值:
E = D - B - C + A
函数代码:
class NumMatrix { public: vector<vector<int>>sum; //求和 NumMatrix(vector<vector<int>>& matrix) { int n = matrix.size(); int m = matrix[0].size(); sum.resize(n+5,vector<int>(m+5)); for(int i = 0;i<n;i++) { for(int j=0;j<m;j++) { sum[i+1][j+1] = sum[i+1][j] + sum[i][j+1] - sum[i][j]+matrix[i][j]; } } } //检索 int sumRegion(int row1, int col1, int row2, int col2) { return sum[row2+1][col2+1]-sum[row2+1][col1]-sum[row1][col2+1]+sum[row1][col1]; } };




386

被折叠的 条评论
为什么被折叠?



