304. Range Sum Query 2D - Immutable
2016-05-17 16:56
519 查看
题目描述: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).Note:The above rectangle (with the red border) is defined by (row1, col1) = (2, 1) and (row2, col2) = (4, 3), which contains sum = 8. Example: [code]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
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.
解题思路:因为要多次调用,所以肯定需要一个数组来保存中间结果,想到用动态规划。但是如何设计动态规划的数组是个问题。我一开始用一个四维数组来表示,严重超时。
后来查看其他人的解法发现只需保存0,0,到行,列的和,通过加减得出想要的结果。
public class NumMatrix {
int[,] matrix;
int length0=0;
int length1=0;
int[][] sum = null;
public NumMatrix(int[,] matrix) {
this.matrix=matrix;
this.length0=matrix.GetLength(0);
this.length1=matrix.GetLength(1);
}
public int SumRegion(int row1, int col1, int row2, int col2) {
if (this.sum == null)
{
this.sum = new int[length0][];
for (int i = 0; i < length0; i++)
sum[i] = new int[length1];
int x = matrix[0, 0];
for (int i = 1; i < length1; i++)
{
x += matrix[0, i];
sum[0][i] = x;
}
int y = matrix[0, 0];
for (int i = 1; i < length0; i++)
{
y += matrix[i, 0];
sum[i][0] = y;
}
sum[0][0] = matrix[0, 0];
for (int i = 1; i < length0; i++)
{
for (int j = 1; j < length1; j++)
{
sum[i][j] = sum[i][j - 1] + sum[i - 1][j] - sum[i - 1][j - 1] + matrix[i,j];
}
}
}
if (row1 >= 1 && col1 >= 1)
return sum[row2][col2] - sum[row1 - 1][col2] - sum[row2][col1 - 1] + sum[row1 - 1][col1 - 1];
else if (row1 == 0 && col1 >= 1)
return sum[row2][col2] - sum[row2][col1 - 1];
else if (row1 >= 1 && col1 == 0)
return sum[row2][col2] - sum[row1 - 1][col2];
else
return sum[row2][col2];
}
}
// Your NumMatrix object will be instantiated and called as such:
// NumMatrix numMatrix = new NumMatrix(matrix);
// numMatrix.SumRegion(0, 1, 2, 3);
// numMatrix.SumRegion(1, 2, 3, 4);
[/code]
相关文章推荐
- Spark 异常 serialVersionUID 不一致问题
- Android Stuido 签名与获取
- 不同浏览器兼容问题—— input 添加required属性 firefox下输入框为红色 +禁止中文输入
- poj 2785 4 Values whose Sum is 0(折半枚举(双向搜索))
- 不同浏览器兼容问题—— input 添加required属性 firefox下输入框为红色 +禁止中文输入
- java中使用队列:java.util.Queue
- 快速排序
- Android入门——构建UI布局的多种方式
- UITableview
- iOS关于UIPresentationController 在视图上面创建一个UIViewController并改变大小
- JAVA设计模式(04):创建型-建造模式(Builder)
- codeforces 675A A. Infinite Sequence(水题)
- FluentData
- IOS 多线程编程之NSOperationQueue
- poj 3368 Frequent values
- easyui combotree加载字典数据
- ios开发 UITextField明文暗文切换光标不准
- dequeueBuffer failed (Device or resource busy)
- 消息队列(Message Queue)简介及其使用
- UE4:本地化收集报错:LogBlueprint:Error: [compiler Fire]