1. 程式人生 > >leetcode 120: 三角形最小路徑和

leetcode 120: 三角形最小路徑和

題目描述:

給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。

例如,給定三角形:

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

自頂向下的最小路徑和為 11(即,3 + 1 = 11)。

說明:

如果你可以只使用 O(n) 的額外空間(n 為三角形的總行數)來解決這個問題,那麼你的演算法會很加分。

兩種解法吧

解答一:從上至下,記錄每個

def minimumTotal(triangle):
    """
    :type triangle: List[List[int]]
    :rtype: int
    """
    a=['0']*(len(triangle)+1)
    for b in triangle:
        for j in range(len(b)-1,-1,-1):
            if a[j]=='0' and a[j+1]=='0':
                a[j+1]=b[j]
            elif a[j]=='0' and a[j+1]!='0':
                a[j+1]=a[j+1]+b[j]
            elif a[j]!='0' and a[j+1]=='0':
                a[j+1]=a[j]+b[j]
            else:
                a[j+1]=min(a[j],a[j+1])+b[j]
    return min(a[1:])

解答二:從下至上,感覺簡單好多

class Solution(object):
    def minimumTotal(self, triangle):
        """
        :type triangle: List[List[int]]
        :rtype: int
        """
        res = triangle[-1]
        for i in range(len(triangle)-2,-1,-1):
            for j in range(len(triangle[i])):
                res[j] = min(res[j],res[j+1])+triangle[i][j]
        return res[0]