程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> LeetCode Triangle

LeetCode Triangle

編輯:C++入門知識

LeetCode Triangle


LeetCode解題之Triangle


原題

將一個二維數組排列成金字塔的形狀,找到一條從塔頂到塔底的路徑,使路徑上的所有點的和最小,從上一層到下一層只能挑相鄰的兩個點中的一個。

注意點:

最好將空間復雜度控制在O(n),n是金字塔的高度

例子:

輸入:

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

輸出: 11 (2 + 3 + 5 + 1 = 11)

解題思路

典型的動態規劃問題,先將問題轉化一下,把每一行的數列都左對齊,如下:

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

可以看出來,其實上一行到下一行就兩個選擇,橫坐標不變或加一。dp[i]表示從底層到這一層的第i個元素所有路徑中最小的和。遞推關系就是 dp[j] = triangle[i][j] + min(dp[j], dp[j + 1]),即下一行與它相鄰的兩個節點中和比較小的再加上它自己的值。

AC源碼

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


if __name__ == "__main__":
    assert Solution().minimumTotal([
        [2],
        [3, 4],
        [6, 5, 7],
        [4, 1, 8, 3]
    ]) == 11

歡迎查看我的Github (https://github.com/gavinfish/LeetCode-Python) 來獲得相關源碼。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved