LeetCode 304. Range Sum Query 2D - Immutable

来源:互联网 发布:淘宝的增高精油有用吗 编辑:程序博客网 时间:2024/05/29 17:10
#include <vector>#include <iostream>using namespace std;/*  Given a 2D matrix, find the sum of the elements inside the rectangle defined by  its upper left corner (row1, col1) and lower right corner(row2, col2).  For example:  Given 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*/// to preCompute the matrix, the time complexity for queries can be lowered down to O(1).class NumMatrix {private:  vector< vector<int> > sumMatrix;private:  void preComputeMatrix(vector< vector<int> >& matrix) {    int m = matrix.size(), n = matrix[0].size();    for(int k = 1; k < m; ++k) {      matrix[k][0] += matrix[k-1][0];    }    for(int k = 1; k < n; ++k) {      matrix[0][k] += matrix[0][k-1];    }    for(int i = 1; i < m; ++i) {      for(int j = 1; j < n; ++j) {        matrix[i][j] += matrix[i-1][j] + matrix[i][j-1] - matrix[i-1][j-1];      }    }  }public:  NumMatrix(vector< vector<int> >& matrix) {    sumMatrix = matrix;    preComputeMatrix(sumMatrix);  }  int sumRegion(int row1, int col1, int row2, int col2) {    return sumMatrix[row2][col2] - sumMatrix[row1 - 1][col2] - sumMatrix[row2][col1 - 1] + sumMatrix[row1-1][col1-1];  }};int main(void) {  vector< vector<int> > 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 sumMatrix(matrix);  int tmp = sumMatrix.sumRegion(2, 1, 4, 3);  int tmp_2 = sumMatrix.sumRegion(1, 1, 2, 2);  int tmp_3 = sumMatrix.sumRegion(1, 2, 2, 4);  cout << tmp << endl;  cout << tmp_2 << endl;  cout << tmp_3 << endl;}

0 0