From ab7e400850a0618aa9e6e48345cf01c34eccdc3f Mon Sep 17 00:00:00 2001 From: shining-ai Date: Tue, 16 Apr 2024 17:59:59 +0000 Subject: [PATCH] =?UTF-8?q?=E3=80=90Arai60=E3=80=9152=E5=95=8F=E7=9B=AE=20?= =?UTF-8?q?39.=20Combination=20Sum?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../52_39_Combination Sum/level_1.py | 17 +++++++++++++++++ .../52_39_Combination Sum/level_2.py | 17 +++++++++++++++++ .../52_39_Combination Sum/level_3.py | 17 +++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_1.py create mode 100644 arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_2.py create mode 100644 arai60/50-53_Greedy_Backtracking/52_39_Combination Sum/level_3.py 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