120 Triangle

# 120 Triangle

題目來源:

https://leetcode.com/problems/triangle/description/

題意分析:

給定一個三角形,找到一條使經過數值之和最小的從頂到下的路徑,每次只能移動到下一層相鄰的結點。題目要求只能使用O(n)的額外空間,n爲三角形行數。

栗子:

 

題目思路:

經典的動態規劃問題,先不管空間問題,創建一個類似的三角形res_triangle,每個位置都記錄從頂到達該位置的最小花費。跟上一題類似,寫出動態轉移方程:

Res_triangle[row][col]=res_triangle[row-1][col]+triangle[row][col]   if col==0

=res_triangle[row-1][col-1]+triangle[row][col]  if col==row

=18.min(res_triangle[row-1][col-1]+triangle[row][col],res_triangle[row-1][col]+triangle[row][col])  if other

初始化Res_triangle[row][col]=triangle[0][0].

 

結果就過了。Leetcode對空間的要求沒有題目要求的嚴格嘛。去DIscuss看到了一種自底向上的解法,空間達到了題目的要求,覺得被題目中的from top to bottom迷惑了。

 

 

代碼:

1. class Solution:  

2.     def minimumTotal(self, triangle):  

3.         """ 

4.         :type triangle: List[List[int]] 

5.         :rtype: int 

6.         """  

7.         res_triangle=[[]]*len(triangle)  

8.         for row in range(0,len(triangle)):  

9.             res_triangle[row]=triangle[row][:]  

10.           

11.         for row in range(1,len(triangle)):  

12.             for col in range(0,row+1):  

13.                 if col==0:  

14.                     res_triangle[row][col]=res_triangle[row-1][col]+triangle[row][col]  

15.                 elif col==row:  

16.                     res_triangle[row][col]=res_triangle[row-1][col-1]+triangle[row][col]  

17.                 else:  

18.                     res_triangle[row][col]=min(res_triangle[row-1][col-1]+triangle[row][col],res_triangle[row-1][col]+triangle[row][col])  

19.           

20.         return min(res_triangle[len(triangle)-1])  

21.               

 

提交細節:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章