lintcode_和为零的子矩阵

给定一个整数矩阵,请找出一个子矩阵,使得其数字之和等于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;
                        }
                    }
                }
            }
        }
    }
点赞