1. 程式人生 > >lintcode_和為零的子矩陣

lintcode_和為零的子矩陣

給定矩陣

[
  [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;
                        }
                    }
                }
            }
        }
    }