Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
For example, given candidate set 2,3,6,7
and target 7
,
A solution set is:
[7]
[2, 2, 3]
In order to get all possible solution, idea is to use DFS to get possible combinations.
if sum==target, add to solution,
if sum>target return
else dfs(...)
Java
public class Solution { List<List<Integer>> result; List<Integer> solu; public List<List<Integer>> combinationSum(int[] candidates, int target) { result = new ArrayList<>(); solu = new ArrayList<>(); Arrays.sort(candidates); getCombination(candidates, target, 0, 0); return result; } public void getCombination(int[] candidates, int target, int sum, int level){ if(sum>target) return; if(sum==target){ result.add(new ArrayList<>(solu)); return; } for(int i=level;i<candidates.length;i++){ sum+=candidates[i]; solu.add(candidates[i]); getCombination(candidates, target, sum, i); solu.remove(solu.size()-1); sum-=candidates[i]; } } }
updated, no golbal variable
public List<List<Integer>> combinationSum(int[] candidates, int target) { List<List<Integer>> res = new ArrayList<>(); List<Integer> temp = new ArrayList<>(); Arrays.sort(candidates); findSum(candidates, target, 0,0,temp, res); return res; } public void findSum(int[] candidates, int target, int sum, int level,List<Integer> temp, List<List<Integer>> res){ if(sum == target) { res.add(new ArrayList<>(temp)); return; } else if(sum > target) { return; } else { for(int i=level;i<candidates.length;i++) { temp.add(candidates[i]); findSum(candidates, target, sum+candidates[i], i, temp, res); temp.remove(temp.size()-1); } } }
class Solution { public: void getCombineSum( int &sum, int level, int target, vector<int> &solution, vector<int> &candidates, vector<vector<int>> &result ){ if(sum > target) return; if(sum == target){ result.push_back(solution); return; } for(int i = level; i<candidates.size(); i++){ sum += candidates[i]; solution.push_back(candidates[i]); getCombineSum(sum,i,target,solution,candidates,result); solution.pop_back(); sum -= candidates[i]; } } vector<vector<int> > combinationSum(vector<int> &candidates, int target) { vector<int> solution; vector<vector<int>> result; int sum = 0; sort(candidates.begin(),candidates.end()); getCombineSum(sum,0,target,solution,candidates,result); return result; } };