最大の矩形leetcode-85-

件名の説明:

方法:動的プログラミング最適化+用い暴力ヒストグラム法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

 

おすすめ

転載: www.cnblogs.com/oldby/p/11729143.html