diff --git a/combination-sum/EGON.py b/combination-sum/EGON.py index 30b9e549e..ca333ddaa 100644 --- a/combination-sum/EGON.py +++ b/combination-sum/EGON.py @@ -5,12 +5,21 @@ class Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: - return self.solveWithDFS(candidates, target) + return self.solveWithBackTracking(candidates, target) """ Runtime: 2039 ms (Beats 5.01%) - + Time Complexity: O(c * c * log c) + - 처음 stack의 크기는 c에 비례 O(c) + - 중복 제거에 사용하는 변수인 curr_visited_checker 생성에 O(c' log c') + - stack의 내부 로직에서 c에 비례한 for문을 순회하는데 O(c) + > O(c) * O(c' log c') + O(c) * O(c) ~= O(c * c * log c) + Memory: 16.81 MB (Beats 11.09%) + Space Complexity: O(c * c) + - curr_combination의 크기가 c에 비례 + - stack의 크기는 curr_combination의 크기와 c에 비례 + > O(c * c) """ def solveWithDFS(self, candidates: List[int], target: int) -> List[List[int]]: result = [] @@ -37,12 +46,37 @@ def solveWithDFS(self, candidates: List[int], target: int) -> List[List[int]]: return result """ - Runtime: ? - - Memory: ? + Runtime: 58 ms (Beats 32.30%) + Time Complexity: O(c * c) + - candidates 정렬에 O(log c) + - 첫 depte에서 dfs 함수 호출에 O(c) + - 그 후 candidates의 길이에 비례해서 재귀적으로 dfs를 호출하는데 O(c) + - lower_bound_idx에 따라 range가 감소하기는 하나 일단은 비례 O(c') + > O(log c) + O(c * c') ~= O(c * c), 단 c' <= c 이므로 이 복잡도는 upper bound + Memory: 16.59 MB (Beats 75.00%) + Space Complexity: O(c) + - result를 제외하고 모두 nonlocal 변수를 call by reference로 참조 + - dfs 함수 호출마다 메모리가 증가하는데, 호출횟수는 candidates의 길이에 비례 O(c) + - lower_bound_idx에 따라 range가 감소하기는 하나 일단은 비례 + > O(c), 단 이 복잡도는 upper bound """ def solveWithBackTracking(self, candidates: List[int], target: int) -> List[List[int]]: - return [] + def dfs(stack: List[int], sum: int, lower_bound_idx: int): + nonlocal result, candidates, target + + if target < sum: + return + elif sum < target: + for idx in range(lower_bound_idx, len(candidates)): + dfs(stack + [candidates[idx]], sum + candidates[idx], idx) + else: # target == sum + result.append(stack) + return + + result = [] + candidates.sort() + dfs([], 0, 0) + return result class _LeetCodeTestCases(TestCase):