class Solution {
public int numSubmatrixSumTarget(int[][] matrix, int target) {
int res=0;
int[][] rowsum=new int[matrix.length][matrix[0].length];
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(j==0){
rowsum[i][0]=matrix[i][0];
}else{
rowsum[i][j]=matrix[i][j]+rowsum[i][j-1];
}
}
}
//System.out.println(rowsum[i][j]);
Map<Integer,Integer> tempnote=new HashMap<Integer,Integer>();
for(int i=0;i<matrix[0].length;i++){
for(int j=i;j<matrix[0].length;j++){
int temp=0;
tempnote.clear();
for(int k=0;k<matrix.length;k++){
temp+=rowsum[k][j]-rowsum[k][i]+matrix[k][i];
if(temp==target){
res++;
}
if(tempnote.containsKey(temp-target)==true){
res+=tempnote.get(temp-target);
}
if(tempnote.containsKey(temp)==true){
tempnote.put(temp,tempnote.get(temp)+1);
}else{
tempnote.put(temp,1);
}
}
}
}
return res;
}
}
核心在于用rowsum把相加操作抽离出来,还有用map省一层循环。