lintcode Range Sum Query 2D - Immutable

飛翔的黃瓜發表於2017-08-22

Range Sum Query 2D - Immutable 

Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper left corner (row1, col1) and lower right corner (row2, col2).

 注意事項
  1. You may assume that the matrix does not change.
  2. There are many calls to sumRegion function.
  3. You may assume that row1 ≤ row2 and col1 ≤ col2.
樣例

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

我自己寫的演算法是逐個相加,測試通過但是時間花費為800ms,以下為我的程式碼

class NumMatrix {
public:
    NumMatrix(vector<vector<int>> ma) :matrix(ma){

    }
    
    int sumRegion(int row1, int col1, int row2, int col2) {
	int r1=row1,c1,r2=row2,c2=col2;
	int sum=0;
    for(;r1<=r2;r1++)
	{
		c1=col1;
		for(;c1<=c2;c1++)
		{
			sum+=matrix[r1][c1];
		}
	}
	return sum;
    }
    private:vector<vector<int>>matrix;
};
/* Your NumMatrix object will be instantiated and called as such:
 * NumMatrix obj = new NumMatrix(matrix);
 * int param_1 = obj.sumRegion(row1,col1,row2,col2);
 */
我看的別人的程式碼,測試時間為300ms,比我的快一倍,想不明白都是O(n2)的時間複雜度,只不過它的計算是在建構函式中,先記錄下來

class NumMatrix {
private:
    vector<vector<int>> dp;

public:
    NumMatrix(vector<vector<int>> matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) {
            return;
        }
        int n = matrix.size();
        int m = matrix[0].size();
        
        dp.resize(n + 1, vector<int>(m + 1, 0));
        for (int r = 0; r < n; r++) {
            for (int c = 0; c < m; c++) {
                dp[r + 1][c + 1] = dp[r + 1][c] + dp[r][c + 1] + matrix[r][c] - dp[r][c];
            }
        }
    }
    
    int sumRegion(int row1, int col1, int row2, int col2) {
        return dp[row2 + 1][col2 + 1] - dp[row1][col2 + 1] - dp[row2 + 1][col1] + dp[row1][col1];
    }
};



相關文章