http://www.lintcode.com/en/problem/submatrix-sum/#
求子矩阵,和为0,要求时间复杂度O(n3)
这道题和求数组中哪些元素和为0的解决方法一样,只是数组中求的是前i个元素和前j个元素和相等,则i-j元素和为0,而这里只是变成2维的而已。
sum[i][j]表示matrix[0][0]到matrix[i-1][j-1]所有元素的和。
sum[i][j] = sum[i - 1][j] + sum[i][j - 1] + matrix[i][j] - sum[i - 1][j - 1]
然后用一条竖线k扫描,diff表示0 ~ k && i ~ j的子矩阵的和,如果与前序某个子矩阵的和相等,则找到对应和为零的子矩阵
注意map初始化的位置
public class Solution {
public int[][] submatrixSum(int[][] matrix) {
// Write your code here
int[][] res = new int[2][2];
if (matrix == null || matrix.length == 0) {
return res;
}
int row = matrix.length;
int col = matrix[0].length;
int[][] sum = new int[row + 1][col + 1];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
sum[i + 1][j + 1] = sum[i][j + 1] + sum[i + 1][j] + matrix[i][j] - sum[i][j];
}
}
for (int i = 0; i < row; i++) {
for (int j = i + 1; j <= row; j++) {
HashMap<Integer, Integer> map = new HashMap();
for (int k = 0; k <= col; k++) {
int diff = sum[j][k] - sum[i][k];
if (map.containsKey(diff)) {
res[0][0] = i;
res[0][1] = map.get(diff);
res[1][0] = j - 1;
res[1][1] = k - 1;
return res;
} else {
map.put(diff, k);
}
}
}
}
return res;
}
}