件名の説明:
方法:動的プログラミング最適化+用い暴力ヒストグラム法Oは(N * 2M)O(NM)Nは、行の数であります
クラスソリューション: DEF maximalRectangle(自己、行列:リスト[リスト[STR]]) - > INT: maxarea = 0 、DP = [0] *(行列[0])lenのため _ 中範囲(LEN(行列))] 用 I における範囲(LEN(行列)) のために、J における範囲(LEN(行列[0])): もし行列[I] [J] == ' 0 ':続ける #はそれと最大幅と更新DPを計算します 幅= DP [I] [J] = DP [I] [J-1] + 1 の場合 jは、他1つの#は[I、J]での右下隅で最大面積の矩形を計算するためのk における範囲(I、-1、-1 :) 幅 = 分(幅、DP [K] [J]) maxarea(=最大maxarea、幅*(I-K + 1 )) 戻り maxarea
方法2:スタックタイトル基準84 O(NM)O(M)
クラスソリューション: DEF maximalRectangle(自己、行列:リスト[リスト[STR]]) - > INT: なら ないマトリックス:リターン0 maxarea = 0 、DP = [0 ため _ 中範囲(LEN(行列[0]))] のために I における範囲(LEN(行列)) のために、J における範囲(LEN(行列[0])): DP [J] = DP [J] + 1 であれば行列[I] [J] == " 1 " 他0 maxarea =MAX(maxarea、self.largestRectangleArea(DP)) 戻りmaxarea デフ largestRectangleArea(自己、高さ:リスト[INT]) - > int型: スタック = [0] 高さ = [0] +高さ+ [0] のres = 0 のための私中範囲(LEN(高さ)) 、一方高[[スタック-1]]> :高さ[I] TMP = stack.pop() RES = MAX(RES、(I -スタック[-1] - 1)* 高さ[TMP]) stack.append(I) の戻り RES
方法3:動的プログラミングO(NM)
クラスソリューション: DEF maximalRectangle(自己、行列:リスト[リスト[STR]]) - > INT: 場合 ではないマトリックスまたは しない [0]マトリックス:リターン0 行 = LEN(行列) COL = LENを(行列[0]) left_j = [-1] * COL right_j = [COL] * COL height_j = [0] * COLの RESの = 0 のための I における範囲(行): cur_left = -1 cur_right= COL 用 J における範囲(COL): もし行列[I] [J] == " 1 " : height_j [J] + = 1 さもなければ: height_j [J] = 0 のための J における範囲(COL): もしマトリックス[ I] [J] == " 1 " : left_j [J] = MAX([J]、cur_left left_j) 他: left_j [J] = -1 cur_left =J のための J における範囲(COL - 1、-1、-1 ): もし行列[I] [J] == " 1 " : right_j [J] = 分(right_j [J]、cur_right) 他: right_j [J ] = COLの cur_right = jの ための J における範囲(COL): RES = MAX(RES、(right_j [J] - 1)* - [J] left_j height_j [J]) 戻り RES