題120. 三角形最小路徑和

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

例如,給定三角形:

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

自下往上給二維列表的本身做最小的自加 判斷相鄰的和的最小值 並賦值給對應位置

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

自上往下添加最小值 需要判斷特殊情況 在第一個最後位置的情況 因爲只能接觸相鄰節點 直接添加不需要對比值的大小

class Solution(object):
    def minimumTotal(self, triangle):
        """
        :type triangle: List[List[int]]
        :rtype: int
        """
        dp = triangle     #這邊的初始化真的是牛逼,不僅不需要把把上面兩行特殊的情況考慮進去,而且爲下面也做了鋪墊。因爲是做累加,所以不需要初始化爲0       
        m = len(dp) 
        #dp是一個list列表,同樣也可以看成是一個二維數組,如圖所示
        # [             [
        #     2,          [2],
        #     3,4        [3,4],
        #     6,5,7     [6,5,7],
        #     4,1,8,3  [4,1,8,3]
        # ]             ]
        # 可以知道3的下一行中相鄰的結點爲6和5,6的下一行中相鄰的結點爲4和1,5的下一行中相鄰的結點爲1和8

        for i in range(1, m): # 對第一行的元素,不需要初始化。如:到2的最短路徑就是2
            for j in range(i+1):
                if j == 0:
                    dp[i][j] += dp[i-1][j]          #第一列的元素來源路徑只可能是由上一行對應列的元素移動而來   
                if j> 0 and j == i:
                    dp[i][j] += dp[i-1][j-1]
                    # 在對角線上的元素 如:4的來源路徑只有可能是從2來
                    # PS:雖然在上面左邊圖中,4和6好像是相鄰的,但是在三角形中,4和6不相鄰  
                    # 我的理解就是根據題目要求得到上面左邊的圖,移動方式只有向下和像45度方向移動兩種情況
                elif (j > 0 and j < i):
                    dp[i][j] += min(dp[i-1][j-1],dp[i-1][j]) #求兩種移動路徑的最小值
        return (min(dp[m-1]))

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