给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于0.输出答案时,请返回左上数字和右下数字的座标。
您在真实的面试中是否遇到过这个题? Yes
样例
给定矩阵
[
[1 ,5 ,7],
[3 ,7 ,-8],
[4 ,-8 ,9],
]
返回 [(1,1), (2,2)]
普通解法:使用空间换时间,四重循环用来确定子矩阵的边界,使用数组记录累积子矩阵的和,这样可以节约两重循环,时间复杂度O(n**4)
int temresp[300][300];
vector<vector<int>> submatrixSum(vector<vector<int>>& matrix){
vector<int>leftup;
vector<int>rido;
vector<vector<int> >res;
int colpre = 0;
int rowpre = 0;
for(int i = 0;i<matrix.size();i++)
{
for(int j = 0;j<matrix[0].size();j++)
{
colpre = matrix[i][j];
for(int k = i;k<matrix.size();k++)
{
if(k!=i)colpre += matrix[k][j];
rowpre = colpre;
for(int l = j;l<matrix[0].size();l++)
{
if(k==i&&l!=j){
temresp[k-i][l-j] = matrix[k][l];
}
if(k!=i&&l!=j){
temresp[k-i][l-j] = temresp[k-i-1][l-j]+matrix[k][l];
}
rowpre+=temresp[k-i][l-j];
if(rowpre==0){
leftup.push_back(i);
leftup.push_back(j);
rido.push_back(k);
rido.push_back(l);
res.push_back(leftup);
res.push_back(rido);
return res;
}
}
}
}
}
}