#120 Triangle
題目來源
https://leetcode.com/problems/triangle/description/
題意分析
在一個二維列表當中存儲着一個三角形形狀的數據,當這些數據被看成是三角形形狀時,求出從上到下(或從下到上)的和的最小值。
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
解題思路
這道題和上一道題一樣,是那種看上去就知道不能貪心,並且後面的選擇和前面所有的選擇都是又關係的,也就是說,增加一個元素,整個所有的路徑都有可能改變。那麼自然而然的想到用遞歸來解決:
定義每一個元素對應一個函數值,這個函數值表示:
以這個元素爲金字塔尖的和的最小值。
那麼對於這個金字塔內的每一個元素而言,他們的f(i,j)值都可明確定義:
f(i,j) = min(f(i+1,j), f(i+1,j+1));
只需要將這個遞歸寫成動態規劃,就可以大大減少時間複雜度。
程序代碼
#This is PYTHON code.
#In this problem, I manipulate the original list,
#because it does't matter.
class Solution:
def minimumTotal(self, triangle):
for i in range(len(triangle) - 1, -1, -1):
if len(triangle) == len(triangle[i]): continue
for j in range(len(triangle[i])):
triangle[i][j] =
min(triangle[i+1][j],triangle[i+1][j+1])+triangle[i][j]
return triangle[0][0]
時間複雜度O(n)
空間複雜度O(n)