39.leetcode Combination Sum(medium)[递归回溯]

来源:互联网 发布:mac安装linux虚拟机 编辑:程序博客网 时间:2024/04/30 14:44

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.
  • 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]]

因为每个元素可以取多次并且最后的结果不能重复,因此先对所有的元素排序,在递归的时候从当前遍历的这个点i开始继续就可以重复遍历。

class Solution {public:    int getSum1(vector<int> &temp)    {        int total = 0;        for(int i = 0;i<temp.size();i++)        {            total += temp[i];        }        return total;    }    void getSum(int start,int n,int target,vector<int>& candidates,vector<int> &mid,vector<vector<int> > &result)    {        int sum = getSum1(mid);        if(target == sum)        {            result.push_back(mid);            return;        }else if(sum > target)            return;        for(int i= start;i<n;i++)        {                mid.push_back(candidates[i]);                getSum(i,n,target,candidates,mid,result);                mid.pop_back();        }        return;    }    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {        int n = candidates.size();        vector<vector<int> > result;        if(n == 0) return result;        vector<int> mid;        sort(candidates.begin(),candidates.end());        getSum(0,n,target,candidates,mid,result);        cout<<result.size()<<endl;        return result;    }};


0 0
原创粉丝点击