Combination Sum

原创 2015年07月09日 23:32:52

题目描述:
给定一个包含多个正数的set容器和目标值target,从set中找出sum等于target的组合,同样的数可以使用多次。例如 set 为 [2,3,6,7]并且target为7,结果为 [7] [2,2,3].

分析:我们先将集合排序,将sum初始化为0,从最小的数开始,将其加到sum上,并存入容器mid保存,将sum与target比较,小于target递归此操作,等于target则将mid加入结果容器,大于target则返回,从mid容器中退出该数,将sum减去该数;对下一个数进行同样的操作。具体代码如下:

void dfscombine(vector<int>& candidates,int level,int& sum,int target,vector<int>& mid,vector<vector<int> >& result)
    {
        if(sum>target) return;
        else if(sum==target)
           result.push_back(mid);
        else
        {
          for(int i=level;i<candidates.size();i++)
          {
              sum+=candidates[i];
              mid.push_back(candidates[i]);
              dfscombine(candidates,i,sum,target,mid,result);
              mid.pop_back();
              sum-=candidates[i];
          }
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<int> mid;  
        vector<vector<int> > result;  
        sort(candidates.begin(),candidates.end());
        int level=0,sum=0;
        dfscombine(candidates,level,sum,target,mid,result);
        return result;
    }

上题中允许一个数使用多次,现在要求每个数只能使用一次,并且上题中的set该为collision,这便成了Combination Sum II。
dfscombine(candidates,i,sum,target,mid,result)这一行代码中可以看出,我们每次递归都将candidates[i]重复计算,为了保证每个数只出现一次,只需将i该为i+1即可,因为collision中会存在相等的数,为了保证结果的唯一性要在for循环最后加入代码:

while(i<candidates.size()-1 && candidates[i]== candidates[i+1]) i++; 

Combination Sum III
在1到9中找到k个数,使其和等于目标值。例如k=3,目标值为9时,有结果:[[1,2,6], [1,3,5], [2,3,4]]
该题解法与上述两天类似,判断时当mid容器中元素个数大于k也要返回,当和值等于目标值并且mid容器中元素个数等于k时才能加入结果容器,代码如下:

void dfscombine(vector<int>& candidates,int level,int& sum,int target,vector<int>& mid,vector<vector<int> >& result,int k)
    {
        if(sum>target||mid.size()>k) return;
        else if(sum==target&&mid.size()==k)
           result.push_back(mid);
        else
        {
          for(int i=level;i<candidates.size();i++)
          {
              sum+=candidates[i];
              mid.push_back(candidates[i]);
              dfscombine(candidates,i+1,sum,target,mid,result,k);
              mid.pop_back();
              sum-=candidates[i];
          }
        }
    }
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<int> mid;  
        vector<vector<int> > result; 
        vector<int> a(9,0);
        for(int i=1;i<10;i++)
           a[i-1]=i;
        int level=0,sum=0;
        dfscombine(a,level,sum,n,mid,result,k);
        return result;
    }

leetCode 39.Combination Sum(组合总和) 解题思路和方法

Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique com...
  • xygy8860
  • xygy8860
  • 2015年07月09日 22:33
  • 1123

Android Studio 生成APK的时候由于布局原因产生打包不能成功

Error: Suspicious namespace and prefix combination [NamespaceTypo] when I try create Signed APK ...
  • csdndouniwan
  • csdndouniwan
  • 2016年09月01日 09:35
  • 3307

leetcode Combination Sum 使用集合中的元素求和得到目标值

http://oj.leetcode.com/problems/combination-sum/ 题目: Given a set of candidate numbers (C) an...
  • gfsfg8545
  • gfsfg8545
  • 2013年10月29日 19:50
  • 1176

Combination Sum求和为给定值的所有序列的解题思路(续)

如前,浪费时间的地方在于对所得结果的排序。而这个排序可以通过改写在递归过程中实现,从而省去以减少运行时间。 为此,要增加一些参数: class Solution { public: voi...
  • ylzintsinghua
  • ylzintsinghua
  • 2014年12月21日 17:00
  • 164

回溯详解及其应用:Leetcode 39 combination sum

原理 初入门 基本定义和概念 举栗子 编程思路 实践 生成符合规范的括号 combination sum n queen原理初入门有时会遇到这样一类题目,它的问题可以分解,但是又不能得出明确的动态规划...
  • c602273091
  • c602273091
  • 2017年01月31日 16:47
  • 342

[LeetCode][Java] Combination Sum II

题目: Given a collection of candidate numbers (C) and a target number (T), find all unique combin...
  • Evan123mg
  • Evan123mg
  • 2015年07月13日 12:02
  • 523

【LeetCode】40. Combination Sum II

【LeetCode】40. Combination Sum II
  • xuanwozhe
  • xuanwozhe
  • 2017年05月23日 13:11
  • 84

377. Combination Sum IV-动态规划

Given an integer array with all positive numbers and no duplicates, find the number of possible comb...
  • u011567017
  • u011567017
  • 2016年09月22日 19:54
  • 551

LeetCode:Combination Sum II

这题跟Combination Sum差不多,区别是: 数组中的数字可以重复 每个出现在数组中数字在一个答案中只能使用一次。 我把给的数组对重复的数字进行了合并,并把数字可使用次数设置为重复次...
  • fytain
  • fytain
  • 2013年08月30日 09:41
  • 1467

Leetcode——216. Combination Sum III

题目:Find all possible combinations of k numbers that add up to a number n, given that only numbers fr...
  • starstar1992
  • starstar1992
  • 2017年01月10日 16:15
  • 161
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Combination Sum
举报原因:
原因补充:

(最多只允许输入30个字)