Leetcode Range Sum Query 2D - Immutable
2015-12-15 11:30
381 查看
Leetcode Range Sum Query 2D - Immutable, 本题主要利用每个区域都可以用为0,0有原点的四个区域,通过加减而快速算出,本题是动态规划的一个经典使用,在图像处理方面使用得相当多,相关算法如下:
测试用例:
using namespace std; class NumMatrix { public: vector<vector<int > > recoder; NumMatrix(vector<vector<int> > &matrix) { int len_row = matrix.size(); int len_col = 0; if (len_row > 0) { len_col = matrix[0].size(); } int sum1 = 0; vector<int> sum2(len_col, 0); recoder = vector<vector<int> >(len_row + 1, vector<int>(len_col + 1, 0)); // we calculate all matrix[0...row][0...col] for (int i = 1; i <= len_row; i ++) { sum1 = 0; for (int col = 0; col < len_col; col ++) { sum2[col] += matrix[i - 1][col]; } for (int j = 1; j <= len_col; j ++) { sum1 += matrix[i - 1][j - 1]; recoder[i][j] = recoder[i - 1][j - 1] + sum1 + sum2[j - 1] - \ matrix[i - 1][j - 1]; } } } int sumRegion(int row1, int col1, int row2, int col2) { // Apply the formula given above. int re = recoder[row2 + 1][col2 + 1]; re -= recoder[row2 + 1][col1]; re -= recoder[row1][col2 + 1]; re += recoder[row1][col1]; return re; } }; // Sample input: ./a.out row col matrix_element_split_by_space calculate_- // regions_four_element_in_a_groupt... int main(int argc, char* argv[]) { int row = atoi(argv[1]); int col = atoi(argv[2]); vector<vector<int> > matrix(row, vector<int>(col, 0)); cout<<"matrix: "<<endl; for (int i = 0; i < row; i ++) { for (int j = 0; j < col; j ++) { matrix[i][j] = atoi(argv[row * i + j + 3]); cout<<matrix[i][j]<<" "; } cout<<endl; } cout<<endl; NumMatrix m(matrix); cout<<"results: "<<endl; for (int i = row * col + 3; i < argc; i += 4) { int row1 = atoi(argv[i]); int col1 = atoi(argv[i + 1]); int row2 = atoi(argv[i + 2]); int col2 = atoi(argv[i + 3]); int re = m.sumRegion(row1, col1, row2, col2); cout<<"sumRegion("<<row1<<", "<<col1<<", "<<row2<<", "<<col2<<"): "<<re<<endl; } return 0; }
测试用例:
input: ./a.out 5 5 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 2 1 4 3 1 1 2 2 1 2 2 4 output: 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 results: sumRegion(2, 1, 4, 3): 8 sumRegion(1, 1, 2, 2): 11 sumRegion(1, 2, 2, 4): 12
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析