Leetcode 120三角形の最小パスと
1つのタイトルの説明(Leetcodeトピックリンク)
三角形を考えると、最小値とトップダウンパスを見つけます。各ステップは、次の行の隣接ノードへ移動することができます。例えば:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
トップダウンと最小経路11(すなわち、2 + 3 + 5 + 1 = 11)。
注:この問題を解決するために、あなただけの余分なスペースをO(n)を使用することができます(nは行数が三角形である)場合には、お使いのアルゴリズムはプラスになります。
この問題に対する解決策2
この題するダイナミックプログラミングの問題は、マトリックスまたは対象の構造に直接入力されたデータを使用して構築定義することができます。
最初に到達します
最小経路ノード、状態遷移です。
の入力データを直接使用する場合は、次の式になります
置換されます
できます。
class Solution:
def minimumTotal(self, triangle: List[List[int]]) -> int:
length = len(triangle)
for i in range(1,length):
for j in range(0,i+1):
if j == 0:
triangle[i][j] = triangle[i-1][j] + triangle[i][j]
continue
if j == i:
triangle[i][j] = triangle[i-1][j-1] + triangle[i][j]
continue
triangle[i][j] = min(triangle[i-1][j-1] + triangle[i][j], triangle[i-1][j] + triangle[i][j])
return min(triangle[length-1])
あなただけ考慮すれば
第1の追加の空間、すなわち、唯一一次元アレイを開き、あなたは、ボトムアップ法を使用することができ、
配列の初期化です
状態遷移に基づいて、次式最後の行の、最終的な結果は
。
class Solution:
def minimumTotal(self, triangle: List[List[int]]) -> int:
length = len(triangle)
DP = triangle[-1]
i = length - 2
while i >= 0:
for j in range(0, 1+i):
DP[j] = min(DP[j] + triangle[i][j], DP[j+1]+triangle[i][j])
i -= 1
return DP[0]