如题
一眼看上去最直观的做法就是双重循环求值了
static int[][] data;
public static void NumMatrix(int[][] matrix) {
data=matrix;
}
public static int sumRegion(int row1, int col1, int row2, int col2) {
int sum=0;
for(int m=row1;m<=row2;m++) {
for(int n=col1;n<=col2;n++) {
sum+=data[m][n];
}
}
return sum;
}
提交到leetcode对应的删除所有static修饰符。结果不出意外,要是这么简单怎么会是中等的题目
运用缓存的思想来解,即对应的(x,y)(m,n)区域和SUM=sum(m,n)-sum(m,y-1)-sum(x,n-1)+sum(x-1,y-1)。对应的sum为对应矩阵的元素和,那我们就缓存这个对应位置的sum
public static void NumMatrix1(int[][] matrix) {
if(matrix==null||matrix.length==0||matrix[0]==null||matrix[0].length==0) {
return ; //必不可少的退出 应对恶心的边界判断 null 及{{}}
}
int [][]da = new int[matrix.length][matrix[0].length]; //注意必须得新建后传给data
da[0][0]=matrix[0][0]; //分类处理
for(int i =1;i<matrix.length;i++) {
da[i][0]=da[i-1][0]+matrix[i][0];
}
for(int i =1;i<matrix[0].length;i++) {
da[0][i]=da[0][i-1]+matrix[0][i];
}
for(int m=1;m<matrix.length;m++) {
for(int n=1;n<matrix[0].length;n++) {
da[m][n]=da[m-1][n]+da[m][n-1]-da[m-1][n-1]+matrix[m][n];
}
}
data =da;
}
public static int sumRegion1(int row1, int col1, int row2, int col2) {
if(data==null) { //对应前面的边界处理
return 0;
}
int sum=0;
if(row1==0&&col1==0) { //应对边界情况的特殊判断
sum=data[row2][col2];
}else if(row1==0) {
sum=data[row2][col2]-data[row2][col1-1];
}else if(col1==0) {
sum=data[row2][col2]-data[row1-1][col2];
}else {
sum=data[row2][col2]-data[row1-1][col2]-data[row2][col1-1]+data[row1-1][col1-1];
}
return sum;
}
应该算是动态规划吧,对于缓存数组同样的是相同的思路里计算,结果很理想