题目描述 结果 //题目类型:二维前缀和 class NumMatrix { public: vector<vector<int>> ans; int n, m; NumMatrix(vector<vector<int>>& matrix) { n = matrix.size(), m = matrix[0].size(); ans.resize(n, vector<int>(m, 0)); for (int i = 0; i < n; ++i) for (int j = 0; j < m; ++j) { ans[i][j] = matrix[i][j]; i && (ans[i][j] += ans[i - 1][j]); //加上正上方位置的值 j && (ans[i][j] += ans[i][j - 1]); //加上左边位置的值 i && j && (ans[i][j] -= ans[i - 1][j - 1]); //减去左上角对角线的值 } } int sumRegion(int row1, int col1, int row2, int col2) { int t = ans[row2][col2]; row1 && (t -= ans[row1 - 1][col2]); //减去子矩阵上方 col1 && (t -= ans[row2][col1 - 1]); //减去子矩阵左侧 row1 && col1 && (t += ans[row1 - 1][col1 - 1]); //加上子矩阵左上角 return t; } }; /** * Your NumMatrix object will be instantiated and called as such: * NumMatrix* obj = new NumMatrix(matrix); * int param_1 = obj->sumRegion(row1,col1,row2,col2); */