给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于0.输出答案时,请返回左上数字和右下数字的坐标。
如果有多个答案, 你可以返回其中任意一个.
预处理一个二维数组 记录矩阵中每个点左上方矩阵的元素之和
for循环起始行和终止行
遍历列坐标 预处理数组中终止行对应元素减去起始行终止元素等于该区间矩阵和
存入HashMap 新的区间要更新新的HashMap
若遍历中发现HashMap中有重复元素 说明这两个矩阵大小相等 中间的小矩阵即为和为0的矩阵
public class Solution {
/*
* @param matrix: an integer matrix
* @return: the coordinate of the left-up and right-down number
*/
public int[][] submatrixSum(int[][] matrix) {
int[][] result = new int[2][2];
int m = matrix.length;
int n = matrix[0].length;
if(matrix == null || m == 0 || n == 0)
return result;
int[][] sum = new int[m+1][n+1];
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
sum[i][j] = matrix[i-1][j-1] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
}
}
for(int i = 0; i < m; i++){
for(int j = i + 1; j <= m; j++){
Map<Integer, Integer> map = new HashMap<>();
for(int k = 0; k <= n; k++){
int diff = sum[j][k] - sum[i][k];
if(map.containsKey(diff)){
result[0][0] = i;
result[1][0] = j-1;
result[0][1] = map.get(diff);
result[1][1] = k-1;
return result;
}
else
map.put(diff, k);
}
}
}
return result;
}
}