Skip to content

Commit a1f9fff

Browse files
committed
39
1 parent 54dce1d commit a1f9fff

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed

39.cpp

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
//https://leetcode.com/problems/combination-sum/
2+
//Difficulty Level: Medium
3+
//Tags: Array, Backtracking
4+
//since we have to print all, and not just count or max or min, we won't use DP but backtracking
5+
6+
class Solution {
7+
public:
8+
vector<vector<int>> combinationSum(vector<int>& candidates, int target)
9+
{
10+
sort(candidates.begin(), candidates.end());
11+
12+
//Note that we don't have duplicates in the array, else we had to delete the duplicates here bcoz
13+
//we can already take each element multiple times, so duplicate elements don't make a difference
14+
15+
int index = candidates.size()-1;
16+
while(index >=0 && candidates[index] > target)
17+
{
18+
index--;
19+
}
20+
21+
vector<int> v;
22+
vector<vector<int>> res; //stores result
23+
backtrack(candidates, target, 0, index, v, res);
24+
return res;
25+
}
26+
27+
void backtrack(vector<int> candidates, int target, int curr_sum, int index, vector<int> v, vector<vector<int>>& res)
28+
{
29+
if(curr_sum == target) //if the sum of elements of v add up to target, push v to result vector
30+
{
31+
res.push_back(v);
32+
return;
33+
}
34+
35+
//check all the elements <= target - curr_sum
36+
for(int i=index; i>=0; i--)
37+
{
38+
curr_sum += candidates[i];
39+
40+
if(curr_sum > target) //don't include the element if sum is exceeding the target
41+
{
42+
curr_sum -= candidates[i];
43+
continue;
44+
}
45+
v.push_back(candidates[i]);
46+
47+
//backtrack to find rest of the elements of v
48+
//note that we have passed 'i' and not 'i+1' since we could include the same element any no. of times
49+
backtrack(candidates, target, curr_sum, i, v, res);
50+
51+
curr_sum -= candidates[i];
52+
v.pop_back();
53+
}
54+
}
55+
};

0 commit comments

Comments
 (0)