給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。
例如,給定三角形:[[
2],[
3,4]
,[6,
5,7]
,[4,
1,8,
3]]自頂向下的最小路徑和為 11(即,2+3
+5+1
=11)。
對於乙個位置來說,它的最小路徑和 就是 自身加上 它所選擇倆邊中的最小路徑。
這樣可以 寫出遞迴搜尋
class
solution
public
intdfs
(list
> ********,
int i,
int j)
return math.
min(
dfs(********, i +
1, j)
,dfs
(********, i +
1, j +1)
)+ ********.
get(i)
.get
(j);
}}
這裡因為i,j都是以上一層進行加一變化的,不用考慮邊界問題
時間複雜度:o(2n),指數級的複雜度,因為 每一次位置的計算都要進行遞迴計算
空間複雜度:o(n),n層的遞迴深度
因為每一次遞迴,都需要進行重複的計算相同位置 的最小路徑,我們建立乙個陣列來記錄這些最小陣列,這樣遞迴到之前計算過的位置,可以直接使用
class
solution
public
intdfs
(int
memo, list
> ********,
int i,
int j)
if(memo[i]
[j]!=0)
memo[i]
[j]= math.
min(
dfs(memo, ********, i +
1, j)
,dfs
(memo, ********, i +
1, j +1)
)+ ********.
get(i)
.get
(j);
return memo[i]
[j];
}}
時間複雜度:o(n2)因為使用了記憶陣列,最終是需要遍歷整個這個三角形就行
空間複雜度:o(n2),使用了二維陣列進行記憶
思路也是和上面的差不多,上面的遞迴搜尋是自頂向下進行遞迴,動態規劃使用自底向上進行,知道初始值,使用for迴圈一直到頂,一層一層向上進行壘加,可以直接得到答案
class
solution
}return dp[0]
[0];
}}
時間複雜度:o(n2),是需要遍歷整個這個三角形就行
空間複雜度:o(n2),使用了二維陣列 作為dp狀態空間
上面是使用了二維陣列空間作為dp的狀態空間,可以優化成 一維陣列作為 狀態空間
class
solution
}return dp[0]
;}}
空間複雜度:o(n) leetcode 120 三角形最小路徑
給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 1 的兩個結點。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為 11 即,2 3 5 1 11 注意 既...
leetcode 120 三角形最小路徑和
給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為11 即,2 3 5 1 11 分析 從右下向左上前進。dp i j min dp i 1 j dp i 1 j i j dp i j 表示...
leetcode120 三角形最小路徑和
給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為 11 即,2 3 5 1 11 說明 如果你可以只使用 o n 的額外空間 n 為三角形的總行數 來解決這個問題,那麼你的演算法會很加分。...