5.2python leetcode 120

120Triangle

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:

Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.


題解:

依然是動態規劃題。

記錄到每一層的每一個位置所需要的最小步數,層層遍歷下去即可。其具體公式如下。

對於每一層,不爲0和最後1個的那一步i和當前層level,其計算方式爲。

step[level][i] = min( step[level-1][i-1] + triangle[level][i], step[level-1][i] + triangle[level][i])

當爲第一個時,那麼只有從上一層的0到達,最後一個時,同理。


當然題目說如果能用O(n)的空間是最好的。因此又使用了一個滾動數組。

具體做法是開2個數組。分別表示到達這一層和上一層的最小步數,代碼如圖。

step = [[999999 for i in range(len(triangle))], [999999 for i in range(len(triangle))]]

而狀態判定也需要修改一下,改爲使用index判斷而不是level。index用level % 2來維護。index-1所對應的便是到達上一層的最小步數。

對於不是最後一個和不是第一個的元素i,修改如下

step[index][i] = min(step[index - 1][i - 1] + triangle[level][i], step[index - 1][i] + triangle[level][i])


代碼如下

class Solution(object):
    def minimumTotal(self, triangle):
        if len(triangle) == 0:
            return 0
        
        if len(triangle) == 1:
            return triangle[0][0]
        
        step = [[999999 for i in range(len(triangle))], [999999 for i in range(len(triangle))]]
        level = 1
        step[0][0] = triangle[0][0]

        while level < len(triangle):
            index = level % 2

            i = 0
            while i < len(triangle[level]):
                if i > 0 and i < len(triangle[level]) - 1:
                    step[index][i] = min(step[index - 1][i - 1] + triangle[level][i],
                                         step[index - 1][i] + triangle[level][i])
                    # tmplist[i] = min(step[i] + triangle[level][i] , step[i-1] +  triangle[level][i])
                else:
                    if i == 0:
                        step[index][i] = step[index - 1][i] + triangle[level][i]
                    else:
                        step[index][i] = step[index - 1][i - 1] + triangle[level][i]

                i = i + 1

            level = level + 1

        return min(step[index])

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