有个算法的问题想请教一下

飞翔的黄瓜 2017-08-22 05:52:04
leetcode上有道题
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.
您在真实的面试中是否遇到过这个题? Yes
样例
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

我的算法是从起点加到终点 如下

/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix obj = new NumMatrix(matrix);
* int param_1 = obj.sumRegion(row1,col1,row2,col2);
*/
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;
};

运行时间差不多800ms
而看别人的代码是这样的

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];
}
};
同样都是O(n2)的时间复杂度,它的时间是300ms 比我的快一倍 这是为什么 难道是因为他的循环在构造函数么?
...全文
223 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
飞翔的黄瓜 2017-08-23
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj 的回复:
你的一直是O(n2) 而别是在初始化处理是O(n2),但实际上后面的计算是常数级的O(1)。 在计算一组数据时区别不大,计算多组数据时区别就出来了。
意思是如果只有一组数据的话,两个时间复杂度应该是一样的把
sdghchj 2017-08-22
  • 打赏
  • 举报
回复
你的一直是O(n2) 而别是在初始化处理是O(n2),但实际上后面的计算是常数级的O(1)。 在计算一组数据时区别不大,计算多组数据时区别就出来了。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧