您的位置:首页 > 产品设计 > UI/UE

lintcode Range Sum Query 2D - Immutable

2017-08-22 17:56 260 查看


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)
.


 注意事项


You may assume that the matrix does not change.
There are many calls to sumRegion function.
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
4000
(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];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lintcode