From 0396c5e11dd94e330a35621c4d11dbea46bc3ba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nadirhan=20=C5=9Eahin?= Date: Tue, 18 Oct 2022 18:47:31 +0300 Subject: [PATCH 1/5] Create combination_sum.py --- backtracking/combination_sum.py | 50 +++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 backtracking/combination_sum.py diff --git a/backtracking/combination_sum.py b/backtracking/combination_sum.py new file mode 100644 index 000000000000..a69a40ebde0c --- /dev/null +++ b/backtracking/combination_sum.py @@ -0,0 +1,50 @@ +""" +In the Combination Sum problem, we are given a list consisting of distinct integers. +We need to find all the combinations whose sum equals to target given. +We can use an element more than one. +Time complexity(Average Case): O(n!), +""" + + +def backtrack( + candidates: list, path: list, answer: list, target: int, previous_index: int +) -> None: + """ + A recursive function that searches for possible combinations. Backtracks in case + of a bigger current combination value than the target value. + + Parameters + ---------- + previous_index: Last index from the previous search + target: The value we need to obtain by summing our integers in the path list. + answer: A list of possible combinations + path: Current combination + candidates: A list of integers we can use. + """ + if target == 0: + answer.append(path.copy()) + else: + for index in range(previous_index, len(candidates)): + if target >= candidates[index]: + path.append(candidates[index]) + backtrack(candidates, path, answer, target - candidates[index], index) + path.pop(len(path) - 1) + + +def combination_sum(candidates: list, target: int) -> list: + path = [] # type: list[int] + answer = [] # type: list[int] + backtrack(candidates, path, answer, target, 0) + return answer + + +def main() -> None: + assert combination_sum([2, 3, 5], 8) == [[2, 2, 2, 2], [2, 3, 3], [3, 5]] + assert combination_sum([2, 3, 6, 7], 7) == [[2, 2, 3], [7]] + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() From 1bba72744efd1b395550f5ec20fa1f9a4494853f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nadirhan=20=C5=9Eahin?= Date: Tue, 18 Oct 2022 18:48:13 +0300 Subject: [PATCH 2/5] Update DIRECTORY.md --- DIRECTORY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 94ec42832e41..c1fad8d9d794 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -23,6 +23,7 @@ * [All Permutations](backtracking/all_permutations.py) * [All Subsequences](backtracking/all_subsequences.py) * [Coloring](backtracking/coloring.py) + * [Combination Sum](backtracking/combination_sum.py) * [Hamiltonian Cycle](backtracking/hamiltonian_cycle.py) * [Knight Tour](backtracking/knight_tour.py) * [Minimax](backtracking/minimax.py) From 084dcbad425262dc1d29165a9eb71530c1eff121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nadirhan=20=C5=9Eahin?= Date: Tue, 18 Oct 2022 20:31:29 +0300 Subject: [PATCH 3/5] Adds doctests Co-authored-by: Christian Clauss --- backtracking/combination_sum.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backtracking/combination_sum.py b/backtracking/combination_sum.py index a69a40ebde0c..572ca1aa7f29 100644 --- a/backtracking/combination_sum.py +++ b/backtracking/combination_sum.py @@ -32,6 +32,14 @@ def backtrack( def combination_sum(candidates: list, target: int) -> list: + """ + >>> combination_sum([2, 3, 5], 8) + [[2, 2, 2, 2], [2, 3, 3], [3, 5]] + >>> combination_sum([2, 3, 6, 7], 7) + [[2, 2, 3], [7]] + >>> combination_sum([-8, 2.3, 0], 1) + Put the right answer here + """ path = [] # type: list[int] answer = [] # type: list[int] backtrack(candidates, path, answer, target, 0) From ed03bd462615bebf27d476387370beb8c50a7322 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nadirhan=20=C5=9Eahin?= Date: Tue, 18 Oct 2022 21:32:49 +0300 Subject: [PATCH 4/5] Update combination_sum.py --- backtracking/combination_sum.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backtracking/combination_sum.py b/backtracking/combination_sum.py index 572ca1aa7f29..cb7969b5d7d3 100644 --- a/backtracking/combination_sum.py +++ b/backtracking/combination_sum.py @@ -2,7 +2,14 @@ In the Combination Sum problem, we are given a list consisting of distinct integers. We need to find all the combinations whose sum equals to target given. We can use an element more than one. -Time complexity(Average Case): O(n!), + +Time complexity(Average Case): O(n!) + +Constraints: +1 <= candidates.length <= 30 +2 <= candidates[i] <= 40 +All elements of candidates are distinct. +1 <= target <= 40 """ @@ -37,8 +44,6 @@ def combination_sum(candidates: list, target: int) -> list: [[2, 2, 2, 2], [2, 3, 3], [3, 5]] >>> combination_sum([2, 3, 6, 7], 7) [[2, 2, 3], [7]] - >>> combination_sum([-8, 2.3, 0], 1) - Put the right answer here """ path = [] # type: list[int] answer = [] # type: list[int] From 92a60e974471fa6e43f8600c23b097b14b43b930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nadirhan=20=C5=9Eahin?= Date: Tue, 18 Oct 2022 22:40:58 +0300 Subject: [PATCH 5/5] Update combination_sum.py --- backtracking/combination_sum.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/backtracking/combination_sum.py b/backtracking/combination_sum.py index cb7969b5d7d3..f555adb751d0 100644 --- a/backtracking/combination_sum.py +++ b/backtracking/combination_sum.py @@ -44,6 +44,10 @@ def combination_sum(candidates: list, target: int) -> list: [[2, 2, 2, 2], [2, 3, 3], [3, 5]] >>> combination_sum([2, 3, 6, 7], 7) [[2, 2, 3], [7]] + >>> combination_sum([-8, 2.3, 0], 1) + Traceback (most recent call last): + ... + RecursionError: maximum recursion depth exceeded in comparison """ path = [] # type: list[int] answer = [] # type: list[int] @@ -52,8 +56,7 @@ def combination_sum(candidates: list, target: int) -> list: def main() -> None: - assert combination_sum([2, 3, 5], 8) == [[2, 2, 2, 2], [2, 3, 3], [3, 5]] - assert combination_sum([2, 3, 6, 7], 7) == [[2, 2, 3], [7]] + print(combination_sum([-8, 2.3, 0], 1)) if __name__ == "__main__":