0と1で満たされた2Dバイナリ行列を考えると、1つだけのを含む最大の矩形を見つけて、その面積を返します。
例:
入力: [ [ "1"、 "0"、 "1"、 "0"、 "0" ]、 [ "1"、 "0"、 "1"、 "1"、 "1" ]、 [「1 」、 "1"、 "1"、 "1"、 "1" ]、 [ "1"、 "0"、 "0"、 "1"、 "0" ] ] 出力: 6
問題の意味
最大の長方形の一つでどこに全体を知るための01のマトリックスを考えます。
考え
すべての連結バーの高さの一部として、この問題は、と見なすことができるで[leetcode] 84最大の長方形ヒストグラムヒストグラムの最大の矩形
フォロー、コードの再利用
コード
1 クラスソリューション{ 2 公共 INT maximalRectangle(CHAR [] []行列){ 3 であれば(matrix.length == 0 ||行列[0] .LENGTH == 0)戻り 0 ; 4 int型の列= matrix.length。 5 int型 COL =行列[0 ] .LENGTH。 6 INT = []高新しい INT [COL]。 7 int型の領域= 0 。 図8は、 のために(int型 i = 0; iは、行<; iは++ ){ 9 用(int型 J = 0; J <COL、J ++){ 10 であれば(行列[I] [J] == '1' ){ 11点 の高さ[J] ++ ; 12 } 他{ 13点 の高さ[J] = 0 。 14 } 15 16 } 17 面積= Math.max(面積、largestRectangle(高さ))。 18 } 19 リターン領域、 20 } 21 22 公衆 INT largestRectangleは(int型{[]高さ) 23 int型の領域を= 0; 24 スタック<整数> S = 新しいスタック<> (); 25 のためには、(int型、I = 0; I <= heights.length;){ 26 のint値= iはheights.lengthを<?高さ[I]:0 ; 27 であれば(s.isEmpty()||値> 高さ[s.peek()]){ 28 s.push(I)。 29 私は++します; 30 } 他{ 31 のint TEMP = s.pop()。 32 面積= Math.max(面積、高さ[TEMP] *(s.isEmpty()I:is.peek() - 1 ))。 33 } // 他エンド 34を } // ための端 35 の戻り領域を、 36 } 37 }