LeetCode 39. Combination Sum 题解

来源:互联网 发布:阿里云 腾讯云 对比 编辑:程序博客网 时间:2024/04/30 13:06

39. Combination Sum

 
 My Submissions
  • Total Accepted: 124666
  • Total Submissions: 357084
  • Difficulty: Medium
  • Contributors: Admin

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


解题思路:

本题可采用深度优先搜索的方法,遍历每一种可行解,具体参见代码注释。

代码展示:

class Solution {public:    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {        int csize= candidates.size();        sort(candidates.begin(),candidates.end());        sol=candidates;        vector<int> tmp;        dfs(tmp,target,0);        return res;            }private:    vector<vector<int> > res;    vector<int> sol;    int sum(vector<int> tmp)    {        int n = tmp.size();        int tmp_sum=0;        for(int i=0;i<n;i++)        {            tmp_sum+=tmp[i];        }        return tmp_sum;    }    void dfs(vector<int> &tmp,int target, int l)    {        if(l==sol.size()) return;//l==size时,所有情况都遍历过        int tmp_tot = sum(tmp); //计算tmp的和,如果大于target则剪枝,等于target则为一合法解,小于target继续添加数        if(tmp_tot>target) return ;        else if(tmp_tot==target)        {            res.push_back(tmp);            return ;        }        else        {            for(int i=l;i<sol.size();i++)            {                tmp.push_back(sol[i]);//添加数sol[i]                dfs(tmp,target,i);                tmp.pop_back();//回溯,删除数sol[i]            }        }            }};


0 0
原创粉丝点击