120. Triangle | LeetCode | Swift

vc7-avatar-img
發佈於LeetCode
更新 發佈閱讀 5 分鐘

每日一題

https://leetcode.com/problems/triangle/description/?envType=daily-question&envId=2025-09-19

日期

2025/9/25

raw-image

Bottom-up DP 解法

分析題目之後,會發現這是一題 DP (Dynamic Programming) 的題目,意味著我們需要找到最小的 routine ,再重複執行 routine 取得最終結果。

Routine

自己 + 最小值(下一行[index], 下一行[index + 1])

從底部往上開始走訪:

class Solution {
func minimumTotal(_ triangle: [[Int]]) -> Int {
var dp = triangle[triangle.count - 1]

for i in stride(from: triangle.count - 2, through: 0, by: -1) {
for j in 0..<triangle[i].count {
// Routine:
// 直接更新 dp[j],選擇下一行兩個可能路徑的最小值
dp[j] = triangle[i][j] + min(dp[j], dp[j + 1])
}
}

return dp[0]
}
}

使用高階函式・一行解法

這個 dp 的寫法還算單純,於是試著自己用用看高階函式

參考 ChatGPT 和 iamhands0me 的解法,最後還是 iamhands0me 寫法最漂亮 ,快幫他按讚:

Swift Algorithm 的 adjacentPairs

這個函式可以幫我們把一個陣列變成兩兩一對(文件),例如:

[4, 1, 8, 3]
// 進行 adjacentPairs
// 結果: [(4, 1), (1, 8), (8, 3)]​

這時候再透過 min 就可以找出最小值:

[(4, 1), (1, 8), (8, 3)].map { min($0, $1) }
// 結果: [1, 1, 3]

更精簡一點就可以寫成這樣

[(4, 1), (1, 8), (8, 3)].map(min)
// 結果: [1, 1, 3]

程式碼

邏輯本身大同小異,比較考驗對高階函式的熟練程度。

class Solution {
func minimumTotal(_ triangle: [[Int]]) -> Int {
triangle
.reversed()
// 建立一個基底為 0 的 dummy 陣列給 bottom most row
.reduce(Array(repeating: 0, count: triangle.count + 1)) {
zip(
$1,
$0.adjacentPairs().map(min)
)
.map(+)
}
.first ?? 0
}
}
留言
avatar-img
留言分享你的想法!
avatar-img
萱寫寫
2會員
16內容數
讀書心得、活動參加心得
萱寫寫的其他內容
2025/09/24
2025/09/24
2025/09/23
LeetCode 每日一題: 2025/09/23
2025/09/23
LeetCode 每日一題: 2025/09/23
2025/09/22
2025/09/22
看更多
你可能也想看
Thumbnail
高中數學主題練習—兩向量夾角
Thumbnail
高中數學主題練習—兩向量夾角
Thumbnail
高中數學主題練習—三點共線
Thumbnail
高中數學主題練習—三點共線
Thumbnail
高中數學主題練習—兩點斜率
Thumbnail
高中數學主題練習—兩點斜率
Thumbnail
高中數學主題練習—兩點斜率
Thumbnail
高中數學主題練習—兩點斜率
Thumbnail
高中數學主題練習—兩向量夾角
Thumbnail
高中數學主題練習—兩向量夾角
Thumbnail
高中數學主題練習—最適直線計算
Thumbnail
高中數學主題練習—最適直線計算
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News