Leetcode 216 Combination Sum III

Find all valid combinations of k numbers that sum up to n such that the following conditions are true:

Only numbers 1 through 9 are used. Each number is used at most once. Return a list of all possible valid combinations. The list must not contain the same combination twice, and the combinations may be returned in any order.

Input: k = 3, n = 7
Output: [[1,2,4]]
Explanation:
1 + 2 + 4 = 7
There are no other valid combinations.
Input: k = 3, n = 9
Output: [[1,2,6],[1,3,5],[2,3,4]]
Explanation:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
There are no other valid combinations.
Input: k = 4, n = 1
Output: []
Explanation: There are no valid combinations. [1,2,1] is not valid because 1 is used twice.

Input: k = 3, n = 2
Output: []
Explanation: There are no valid combinations.
Input: k = 9, n = 45
Output: [[1,2,3,4,5,6,7,8,9]]
Explanation:
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 = 45
​​​​​​​There are no other valid combinations.
  • Soruda bize k ve n sayıları veriliyor.1-9 arası rakamların kombinasyonlarını kullanarak n sayısını bulmamız isteniyor.k kombinasyonda kaç rakam kullanabiliriz n sayısı ise bu rakamların toplamı olan sayı.Ve 1-9 arası rakamları sadece bir kere kullanabiliriz.
  • n = 3 k = 7 olsun bu durumda cevap sadece (1,2,4) olur.Sadece bu kombinasyonun sonucu 7 sayısını verir.
  • Oluşturacağımız backtrack fonksiyonunu rekürsif olarak çağırarak kombinasyonları arayabiliriz.
  • İlk olarak (1) buluruz sonrasında (1,2),(1,3),(1,4)… (1,9) alt çağrılarını yaparız.Devamında bu kollarda (1,2,3),(1,2,4),(1,2,5) şeklinde devam eder.
image
    def combinationSum3(self, k: int, n: int) -> List[List[int]]:
        results = []
        def backtrack(remain, comb, next_start):
            if remain == 0 and len(comb) == k:
                # make a copy of current combination
                # Otherwise the combination would be reverted in other branch of backtracking.
                results.append(list(comb))
                return
            elif remain < 0 or len(comb) == k:
                # exceed the scope, no need to explore further.
                return

            # Iterate through the reduced list of candidates.
            for i in range(next_start, 9):
                comb.append(i+1)
                backtrack(remain-i-1, comb, i+1)
                # backtrack the current choice
                comb.pop()

        backtrack(n, [], 0)

        return results