Given an integer matrix, find a submatrix where the sum of numbers is zero. Your code should return the coordinate of the left-up and right-down number.
Example
Given matrix
[
[1 ,5 ,7],
[3 ,7 ,-8],
[4 ,-8 ,9],
]
return
[(1,1), (2,2)]
Challenge
Analysis:
O(n3) time.
If the matrix is Nx1, we can solve it easily like sum of contiguous subsequense. If it's Nx2, we just need to repeat the same process 3 times -- the first column, the second column and sum of the two columns as an Nx1 array. That's applicable to any cases.
class Solution { public: vector<vector<int>> submatrixSum(vector<vector<int>>& matrix) { vector<vector<int>> res; int m = matrix.size(); if(0 == m) return res; int n = matrix[0].size(); for(int i=0;i<n;i++) { vector<int> sum(m, 0); for(int j=i;j<n;j++) { //sum[k] is the sum of matrix (k,i), (k,j) //sum of subarray of sum[k] can be all sub //matrix of (0,i), (m-1,j) for(int k=0;k<m;k++) sum[k] += matrix[k][j]; //find a subarray with 0 sum int lastSum = 0; unordered_map<int, int> set; set[0] = -1; for(int v=0;v<m;v++) { lastSum += sum[v]; if(set.count(lastSum)) { res.push_back(vector<int>({set[lastSum]+1, i})); res.push_back(vector<int>({v, j})); return res; } set[lastSum] = v; } } } return res; } };