Combination Sum:所有数都正数,原始数组中没有重复的数字,生成的子数组中可以重复使用某一个数值

Combination Sum II : 所有数都正数,原始数组中有重复的数字,生成的子数组中不能重复使用某一个数值

Combination Sum III: 所有数都正数且只能是1到9之间的数,原始数组中没有重复的数字,生成的子数组中不能重复使用某一个数值

Combination Sum IV: 所有数都正数,原始数组中没有重复的数字,生成的子数组中可以重复使用某一个数值。但是这个不再是把所有的子数组找出来,而是找所有可能的子数组的个数。

39. Combination Sum

依旧与subsets问题相似,每次选择这个数是否参加到求和中。相对于subsets问题,增加一个target变量用于记录数值的和,并且result的push_back的条件也随之发生变化。

因为所有数字都是大于0的,所以target小于0就可以结束循环了。

因为是可以重复的,所以每次递归还是在i上,如果不能重复,就可以变成i+1。

class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> result;
vector<int> res;
int length = candidates.size();
if(length <= )
return result;
combination(candidates,result,res,target,);
return result;
}
void combination(vector<int> candidates,vector<vector<int>> &result,vector<int> &res,int target,int start){
if(target < )
return;
if(target == ){
result.push_back(res);
}
for(int i = start;i < candidates.size();i++){
res.push_back(candidates[i]);
combination(candidates,result,res,target-candidates[i],i);
res.pop_back();
}
}
};

https://www.jianshu.com/p/b2037dd2841a

类似于全排列和n皇后,用dfs形成一个n * m的matrix的遍历形式

40. Combination Sum II

与39题的不同在于:第一,本题有重复节点;第二,每个节点只能用一次,即没有自环

如何处理自环问题?每次搜索新路径的时候都从其下一个节点开始,而不是从它本身开始;

如何处理去重问题?每次回溯的时候,刚刚被剔除的节点不能在任何时候再被重新加入到路径上。如何处理这个“任何时候”呢?要么用map标记被剔除的节点直到路径搜索结束,要么应用排序,将所有有相同出权值的节点都放到一起, 通过排序就可以实现,这样可以方便找到下一个出权值不同的节点。

除了这两个部分,其他的与 Combination Sum一样。

class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>> result;
vector<int> res;
int length = candidates.size();
if(length <= || target <= )
return result;
sort(candidates.begin(),candidates.end());
combination(candidates,result,res,target,);
return result;
}
void combination(vector<int> candidates,vector<vector<int>> &result,vector<int> &res,int target,int start){
if(target < )
return;
if(target == ){
result.push_back(res);
return;
}
for(int i = start;i < candidates.size();i++){
res.push_back(candidates[i]);
combination(candidates,result,res,target-candidates[i],i+);
res.pop_back();
while(i < candidates.size() - && candidates[i] == candidates[i+])
i++;
}
}
};

http://www.cnblogs.com/tengdai/p/9257266.html

Combination Sum II是数组里面有重复的数字,但不像I那样允许你在你本身上进行重复,所以要用i+1

216. Combination Sum III

这个题与前两者不同的是,规定了组合的数字的个数,这样你就只能递归到第k层了,相当于在递归截止条件处要增加东西。

还有就是不再是一个输入的数组,而是直接1到9。原本发现需要把1到9输入到数组中,后来发现直接在递归里面写也是可以的。

class Solution {
public:
vector<vector<int>> combinationSum3(int k, int n) {
vector<vector<int> > result;
if(k <= || n <= )
return result;
vector<int> res;
int start = ;
combinationSum3(k,n,result,res,start);
return result;
}
void combinationSum3(int k,int n,vector<vector<int> >& result,vector<int>& res,int start){
if(n < )
return;
if(res.size() == k){
if(n == )
result.push_back(res);
return;
}
for(int i = start;i <= ;i++){
res.push_back(i);
combinationSum3(k,n-i,result,res,i+);
res.pop_back();
}
}
};

377. Combination Sum IV

这个题与39. Combination Sum 几乎一样,但是39. Combination Sum 是找所有可能的组合,这个题是找所有可能的子数组的个数,使用dfs也可以做,但在平台上会超时,采用dp的方式时间复杂度小。

dp[i]表示利用当前数组数字到数字i可以生成的个数。

class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<unsigned int> dp(target + );
dp[] = ;
for(int i = ;i <= target;i++){
for(int j = ;j < nums.size();j++){
if(i - nums[j] >= )
dp[i] += dp[i - nums[j]];
}
}
return (int)dp[target];
}
};

注意:[3,33,333]
   10000

   这种情况,如果vector是int初始化,会报int相加越界的错误

http://www.cnblogs.com/grandyang/p/5705750.html

leetcode 39. Combination Sum 、40. Combination Sum II 、216. Combination Sum III的更多相关文章

  1. Leetcode之回溯法专题-40. 组合总和 II(Combination Sum II)

    Leetcode之回溯法专题-40. 组合总和 II(Combination Sum II) 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使 ...

  2. 记录我的 python 学习历程-Day13 匿名函数、内置函数 II、闭包

    一.匿名函数 以后面试或者工作中经常用匿名函数 lambda,也叫一句话函数. 课上练习: # 正常函数: def func(a, b): return a + b print(func(4, 6)) ...

  3. leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes

    263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...

  4. leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String

    344. Reverse String 最基础的旋转字符串 class Solution { public: void reverseString(vector<char>& s) ...

  5. leetcode 198. House Robber 、 213. House Robber II 、337. House Robber III 、256. Paint House(lintcode 515) 、265. Paint House II(lintcode 516) 、276. Paint Fence(lintcode 514)

    House Robber:不能相邻,求能获得的最大值 House Robber II:不能相邻且第一个和最后一个不能同时取,求能获得的最大值 House Robber III:二叉树下的不能相邻,求能 ...

  6. leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)

    136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solu ...

  7. lintcode 787. The Maze 、788. The Maze II 、

    787. The Maze https://www.cnblogs.com/grandyang/p/6381458.html 与number of island不一样,递归的函数返回值是bool,不是 ...

  8. 代码随想录第八天 |344.反转字符串 、541. 反转字符串II、剑指Offer 05.替换空格 、151.翻转字符串里的单词 、剑指Offer58-II.左旋转字符串

    第一题344.反转字符串 编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 s 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的额外空间解决这 ...

  9. Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III)

    Leetcode之回溯法专题-216. 组合总和 III(Combination Sum III) 同类题目: Leetcode之回溯法专题-39. 组合总数(Combination Sum) Lee ...

随机推荐

  1. TortoiseGit用户手册

    3 配置TortoiseGit 3.1 生成公钥 生成SSH安全密钥,提供给GIT版本库管理员以访问Git 版本库,点击桌面上生成的图标 然后执行执行“ssh-keygen”生成自己的公钥: 一路回车 ...

  2. 为什么不要 "lock(this)" ? lock object 并是readonly(转载)

    一. 为什么要lock,lock了什么?   当我们使用线程的时候,效率最高的方式当然是异步,即各个线程同时运行,其间不相互依赖和等待.但当不同的线程都需要访问某个资源的时候,就需要同步机制了,也就是 ...

  3. 在php中怎么利用js把参数传递给弹窗

    1.在php页面中经常用到把参数传递给弹窗页面,在弹窗页面中操作 2.两种方式,截图为一种 3.最常见的就是利用hideen隐藏域,点击按钮的时候把要传递的参数值传递给隐藏域,需要的时候在弹窗中获取. ...

  4. RequestAnimationFrame更好的实现Javascript动画

    一直以来,JavaScript的动画都是通过定时器和间隔来实现的.虽然使用CSS transitions 和 animations使Web开发实现动画更加方便,但多年来以JavaScript为基础来实 ...

  5. spring-boot-starter-actuator不起作用

    spring-boot-starter-actuator的作用,actuator是监控系统健康情况的工具.使用这个功能首先要先添加依赖,如下.<!-- 监控和管理生产环境--><de ...

  6. css中的线及vertical-align

    行内元素格式化顺序: 相关概念:  leading(行间距):指填充在两行文字间的铅条,等于line-height 和 font-size之差,其中一半leading加到文字上方,另一半leading ...

  7. ubuntu下创建虚拟python3开发环境

    友情链接:ubuntu16.04下安装python3+创建虚拟python3开发环境 1.为什么要创建python3虚拟开发环境? /********************************* ...

  8. 多张报表导出到一个多sheet页excel

     业务需求: 通过勾选不同的报表名称,然后直接执行导出excel.并且这些报表需要统一导入到一个excel的多个sheet页中,并且对某些报表可能需要增加一些类似'已审核'之类的图片(展现时并没有 ...

  9. aix系统下的websphere的静默安装

     一:环境 aix5.3,websphere6(ND版本,WebSphereV6.1_for_AIX_64-bit_Support.tar),注意:aix和websphere的版本问题 二:安装 ...

  10. Spring Boot -01- 快速入门篇(图文教程)

    Spring Boot -01- 快速入门篇(图文教程) 今天开始不断整理 Spring Boot 2.0 版本学习笔记,大家可以在博客看到我的笔记,然后大家想看视频课程也可以到[慕课网]手机 app ...