[LeetCode39]Combination Sum

来源:互联网 发布:淘宝手机端详情页宽度 编辑:程序博客网 时间:2024/06/10 03:06

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:

  • All numbers (including target) will be positive integers.
  • Elements in a combination (a1a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
  • The solution set must not contain duplicate combinations.

For example, given candidate set 2,3,6,7 and target 7
A solution set is: 
[7] 
[2, 2, 3] 

Analysis:

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);            }        }    }


c++

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;}};




3 0