↓快轉到主要內容
  1. LeetCode/

LeetCode 216: Combination Sum III

·1 分鐘· ·
LeetCode Medium Array Backtracking
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-11-12

  • 提交紀錄:Wrong Answer → Accepted ×2

解題思路
#

跟 LC 77 一樣的組合回溯(Backtracking 模板),候選數固定是 1 到 9,下一層從 i + 1 開始。剪枝:數量超過 k 或總和超過 n 就停。

我的嘗試
#

第一版的候選數寫成 range(min_number + 1, n + 1),用了 1 到 n 而不是 1 到 9:k = 3、n = 24 回傳了 [1, 2, 21] 這種組合。改成只用 1 到 9 才 AC。

正確解法
#

class Solution:
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        res = []
        def dfs(start, remain, path):
            if len(path) == k:
                if remain == 0:
                    res.append(path[:])
                return
            for x in range(start, 10):
                if x > remain:
                    break
                path.append(x)
                dfs(x + 1, remain - x, path)
                path.pop()
        dfs(1, n, [])
        return res

複雜度
#

時間 O(C(9, k) · k),空間 O(k)。

要特別避免的錯誤
#

  • 候選數只有 1 到 9,不是 1 到 n。

面試口說整理
#

候選數只有 1 到 9,每個最多用一次,我用組合的回溯,下一層從比目前大的數開始,選滿 k 個時檢查總和是否為 n,超過就剪掉。

相關文章

LeetCode 78: Subsets
·1 分鐘
LeetCode Medium Array Backtracking Bit-Manipulation
LeetCode 78 解題筆記:每個元素選或不選;迭代寫法是每加入一個數,就把現有的每個子集合複製一份並加上它
LeetCode 79: Word Search
·2 分鐘
LeetCode Medium Array String Backtracking Depth-First-Search
LeetCode 79 解題筆記:從每一格開始回溯,往四個方向比對下一個字元,走過的格子暫時標記,回溯時還原;先用字元次數剪枝
LeetCode 90: Subsets II
·1 分鐘
LeetCode Medium Array Backtracking Bit-Manipulation
LeetCode 90 解題筆記:先排序;遇到跟前一個相同的數,只延伸上一步新產生的那些子集合
LeetCode 47: Permutations II
·1 分鐘
LeetCode Medium Array Backtracking Sorting
LeetCode 47 解題筆記:先排序,同一層如果跟前一個值相同而且前一個還沒被用,就跳過
LeetCode 39: Combination Sum
·1 分鐘
LeetCode Medium Array Backtracking
LeetCode 39 解題筆記:同一個數可以重複選,所以遞迴時下一層從 i 開始(不是 i + 1),這樣也避免了順序不同的重複
LeetCode 40: Combination Sum II
·1 分鐘
LeetCode Medium Array Backtracking
LeetCode 40 解題筆記:每個數只能用一次而且有重複,排序後下一層從 i + 1 開始,同一層跳過跟前一個相同的值