--- title: '39. Combination Sum' description: Given an array of distinct integers candidates and a target integer target, return a list of all unique combinations of candidates where the chosen numbers sum to target. You may return the combinations in any order sidebar: label: 'Combination Sum' badge: 'Medium' --- Array ### Example 1: - Input: `candidates = [2,3,6,7], target = 7` - Output: `[[2,2,3],[7]]` - Explanation: `2` and `3` are `candidates`, and `2 + 2 + 3 = 7`. Note that `2` can be used multiple times. `7` is a candidate, and `7 = 7`. These are the only two combinations. ### Example 2: - Input: `candidates = [2,3,5], target = 8` - Output: `[[2,2,2,2],[2,3,3],[3,5]]` ### Example 3: - Input: `candidates = [2], target = 1` - Output: `[]` ### Constraints: - `1 <= candidates.length <= 30` - `2 <= candidates[i] <= 40` - All elements of `candidates` are distinct. - `1 <= target <= 40` ## Solution ```py class Solution: def combinationSum(self, candidates: list[int], target: int) -> list[list[int]]: candidates.sort() result, path = [], [] def backtrack(start, remaining): if remaining == 0: result.append(path[:]) return for i in range(start, len(candidates)): if candidates[i] > remaining: break path.append(candidates[i]) backtrack(i, remaining - candidates[i]) path.pop() backtrack(0, target) return result ```