Python編程作業【第九周】(一)

#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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章