leetcodeの最大矩形C++解法

3221 ワード

leetcodeの最大矩形C++解法
0と1のみを含む2次元バイナリ行列を与え,1のみを含む最大矩形を探し出し,その面積を返す.
  :
[
  ["1","0","1","0","0"],
  ["1","0","1","1","1"],
  ["1","1","1","1","1"],
  ["1","0","0","1","0"]
]
  : 6

道題の2次元行列は各層を上にして1つのヒストグラムと見なすことができ,入力行列が何行あるか,何個のヒストグラムを形成することができ,各ヒストグラムに対してLargest Rectangle in Histogramにおける方法を呼び出すことで,最大の矩形面積を得ることができる.では、この問題で唯一しなければならないのは、各層をヒストグラムの下層として上にヒストグラム全体を構築することです.テーマは入力マトリクスの文字が「0」と「1」の2種類しかないことを限定しているので、処理も比較的簡単です.方法は,各点に対して,‘0’であれば0,‘1’であれば前のheight値に1を加える.この問題は前の文章の柱状図の矩形面積問題に変換することができ,m*nの行列はn組の柱状図と見なしてそれぞれ処理することができる.各セットの柱図の各柱の高さを追加で計算するだけです.魅族柱状図の各柱の高さを計算します.
for(int i=0;i

標示中の行列については、高さ行列を求めることができる.
[ 
  [ 1, 0, 1, 0, 0 ],
  [ 2, 0, 2, 1, 1 ],
  [ 3, 1, 3, 2, 2 ],
  [ 4, 0, 0, 3, 0 ]
]

各行の配列に対して柱状図の矩形面積問題の結果を呼び出せばよく,最後に各群の柱状図の結果を比較して最終結果を得る.
完全なコード:
class Solution {
public:
    int maximalRectangle(vector > &matrix) {
        int res = 0;
        vector height;
        for (int i = 0; i < matrix.size(); ++i) {
            height.resize(matrix[i].size());//                                 。
            for (int j = 0; j < matrix[i].size(); ++j) {
                height[j] = matrix[i][j] == '0' ? 0 : (1 + height[j]);
            }
            res = max(res, largestRectangleArea(height));
        }
        return res;
    }

   int largestRectangleArea(vector& heights) {
        if(heights.empty())
            return 0;
        stack st;
        heights.push_back(0);
        int res0=0;
        for(int i=0;ires0)
                    res0=width*curHeight;
            }
            st.push(i); //               
        }
        return res0;
    }
};

上のコードを関数にアンインストールすることもできます.
class Solution {
public:
    int maximalRectangle(vector > &matrix) {
        int res = 0;
        vector height;
        for (int i = 0; i < matrix.size(); ++i) {
            height.resize(matrix[i].size());
            for (int j = 0; j < matrix[i].size(); ++j) {
                height[j] = matrix[i][j] == '0' ? 0 : (1 + height[j]);
            }
            //largestRectangleArea()
            vector heights=height;
            if(heights.empty())
                return 0;
            stack st;
            heights.push_back(0);
            int res0=0;
            for(int i=0;ires0)
                        res0=width*curHeight;
                }
                st.push(i); //               
            }
            res = max(res, res0); //         
        }
        return res;
    }
    };