diff --git a/arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_1.py b/arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_1.py new file mode 100644 index 0000000..1f0e34c --- /dev/null +++ b/arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_1.py @@ -0,0 +1,17 @@ +# Backtracking +class Solution: + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: + def make_combination(remain, current, begin): + if remain == 0: + combinations.append(current[:]) + return + if remain < 0: + return + for i in range(begin, len(candidates)): + current.append(candidates[i]) + make_combination(remain - candidates[i], current, i) + current.pop() + + combinations = [] + make_combination(target, [], 0) + return combinations diff --git a/arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_2.py b/arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_2.py new file mode 100644 index 0000000..8b6de1b --- /dev/null +++ b/arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_2.py @@ -0,0 +1,17 @@ +# Backtracking +# 再帰が深いので、stackで書き直した +class Solution: + def combinationSum( + self, candidates: List[int], target: int) -> List[List[int]]: + stack = [(target, [], 0)] + combinations = [] + while stack: + before_remain, before_combination, begin = stack.pop() + for i in range(begin, len(candidates)): + remain = before_remain - candidates[i] + combination = before_combination + [candidates[i]] + if remain == 0: + combinations.append(combination) + elif 0 < remain: + stack.append((remain, combination, i)) + return combinations diff --git a/arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_3.py b/arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_3.py new file mode 100644 index 0000000..f141169 --- /dev/null +++ b/arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_3.py @@ -0,0 +1,17 @@ +sys.setrecursionlimit(2000) +class Solution: + def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: + def make_combinations(remain, combination, begin): + if remain < 0: + return + if remain == 0: + combinations.append(combination[:]) + return + for i in range(begin, len(candidates)): + combination.append(candidates[i]) + make_combinations(remain - candidates[i], combination, i) + combination.pop() + + combinations = [] + make_combinations(target, [], 0) + return combinations