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_middle_35_377. Combination Sum IV

题意: 给定一个不重复的正整数数组和一个正整数,找出数组的数相加等于这个正整数的可能组合数。(组合中的数字可以重复,可以不必使用所有数组的数,不同顺序各算一种) 分析: 我们要得出之和的可能数,就是要...
  • pusude
  • pusude
  • 2017年02月10日 15:53
  • 59

LeetCode 39:Combination Sum

每一次向下搜索时,起始位置都和上一次相同,因为可以取相同元素不止一次,即每次向下传入的index For循环每次从index开始,避免返回到之前的元素 DFS搜索 如果sum>target 则r...

leetcode -- Combination Sum II -- 重点

https://leetcode.com/problems/combination-sum-ii/与Combination Sum一样,只是每个元素只能用一次。子节点集合不包括本身就行。还是要排序,排...
  • xyqzki
  • xyqzki
  • 2015年12月14日 14:04
  • 210

Combination Sum I

题: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C...
  • haihaa
  • haihaa
  • 2016年05月07日 13:51
  • 130

LeetCode: Combination Sum

#include #include #include using namespace::std; class Solution { public: vector > combinationS...
  • wyc1230
  • wyc1230
  • 2012年09月30日 11:35
  • 423

DAY19:leetcode #40 Combination Sum II

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in...

LeetCode—*Combination Sum II(DFS算法C数组中有重复值)

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in...

[leetcode] 40. Combination Sum II

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in...

Combination Sum I&II Pernutation I&II

leetcode

leetcode:Combination Sum(I,II)

原题: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Combination Sum
举报原因:
原因补充:

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