件名の説明:
最初の投稿:
クラスのソリューション: デフトラップ(自動、高さ:リスト[INT]) - > int型: RESの = 0 デフヘルパー(高さ): ローカル以外の解像度 場合 lenは(高さ)<= 1 : リターン・ キュー = [] のための私で高さ: もしキューと私は> = キュー[0]: RES + =合計(キュー[0] - jのための J におけるキュー) キュー = [I] 他: queue.append(I) ヘルパー(キュー[:: -1 ]) ヘルパー(高さ) の戻りRES
方法:動的プログラミング:O(N)O(N)
クラスのソリューション: DEFの罠(セルフ、高さ:リスト[INT]) - > int型: IF ない高さ:リターン0 N- = LEN(高さ) max_left = [0] * N- max_right = [0] * N- max_left [0] = 高さ[0] max_right [ -1] =高さ[-1 ] #が最大左位置Iを見つける ために私に範囲(1 、N-): max_left [I] = MAX(身長[i]は、max_leftの[1-I ] ) #最大値I右の場所を見つける ためにI における範囲(N-2、-1、-1 ): max_right [I] = MAX(身長[I]、max_right [I + 1 ]) #1 プリント(max_left) #1 プリント(max_right) #求结果 RES = 0 以下のための私に:範囲(N) RES - + =分(max_left [I]、max_right [i])と高さ[I] 戻り RES
方法2:二重ポインタO(N)O(1)
クラスのソリューション: デフトラップ(自動、高さ:リスト[INT]) - > int型: もし ない高さ:リターン0 左 = 0 右 = LEN(高さ) - 1つの RES = 0 #记录左右边最大值 left_max = 高さ[左] right_max = 高さ[右] ながら左< 右: もし高さ[左] < 高さ[右]: もし left_max> 高さ[左]: RES+ = left_max - [左]高 他: left_max = 高さ[左] 左 + = 1 さもなければ: もし right_max> 高さ[右]: RES + = right_max - 高[右] 他: right_max = 高さ[右] 右 - = 1つの リターン RES
方法3:スタックO(N)
クラスのソリューション: デフトラップ(自動、高さ:リスト[INT]) - > int型: もし ない高さ:リターン0 、N = LEN(高さ) スタック = [] のres = 0 のための I における範囲(N): #の印刷(スタック) しながらスタックと高さが<[-1]スタック] 高さ[I]: TMP = stack.pop() 場合 ではないスタック:ブレーク RESを+ =(MIN(身長[I]、高さ[スタック[-1]) -高さ[TMP])*(I-スタック[-1] - 1 ) stack.append(I) の戻り RES