[array] leetcode - 39. Combination Sum - Medium
leetcode - 39. Combination Sum - Medium
descrition
Given a set of candidate numbers (C) (without duplicates) 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]
]
解析
典型的回溯法求解。代码实现中给出了 3 中回溯的方式,都 accepted。微妙的区别应该是在递归的层数不同。对于 candidates[index] 只有两种情况,即:选择或不选择,值得注意的是如果选择的话可以多次重复选择。(可以使用状态转换图进行抽象更便于理解,重复选择实际上是在 index 状态有环,而不选择则是向 index + 1 状态的迁移)
注意:
- 调用函数前用了一个排序,主要是为了递归时剪枝做准备,数组是递增排序,如果太大则可以停止更深层的递归
- 题目说了所有数都是 positive,这其实也可以作为剪枝的条件
- 题目说数组中不存在 duplicate 元素,如果存在的话还需要跳过重复的元素。
一般的,对于回溯问题,找好递归求解的子结构,记得结束点即出口的检查,避免无限循环。在递归过程中可以思考是否可以进行剪枝。
code
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution{
public:
vector<vector<int> > combinationSum(vector<int>& candidates, int target){
vector<vector<int> > ans;
vector<int> vecCur;
sort(candidates.begin(), candidates.end());
combinationSumBacktracking0(candidates, 0, target, vecCur, ans);
//combinationSumBacktracking1(candidates, 0, target, vecCur, ans);
//combinationSumBacktracking2(candidates, 0, target, vecCur, ans);
return ans;
}
// candidates in ascending
void combinationSumBacktracking0(vector<int>& candidates, int index, int target,
vector<int>& vecCur, vector<vector<int> >& ans){
if(target < 0)
return;
if(target == 0 && !vecCur.empty()){
ans.push_back(vecCur);
return;
}
// sub-problem, for each element in candidates[index,...,n-1]
// just have two condition: choose or not
for(int i=index; i<candidates.size(); i++){
if(candidates[i] > target) // Note: candidates must in ascending order
break;
// note: not i+1, because the same repeaded number may be chosen from candidates
vecCur.push_back(candidates[i]);
combinationSumBacktracking0(candidates, i, target - candidates[i], vecCur, ans);
vecCur.pop_back();
}
}
void combinationSumBacktracking1(vector<int>& candidates, int index, int target,
vector<int>& vecCur, vector<vector<int> >& ans){
if(target < 0)
return;
if(target == 0){
if(!vecCur.empty())
ans.push_back(vecCur);
return;
}
if(index >= candidates.size())
return;
// choose candidates[index]
// Note: candidates[index] can be choose more than onece
vecCur.push_back(candidates[index]);
combinationSumBacktracking1(candidates, index, target - candidates[index], vecCur, ans);
vecCur.pop_back();
// dosen't choose candidates[index]
combinationSumBacktracking1(candidates, index+1, target, vecCur, ans);
}
void combinationSumBacktracking2(vector<int>& candidates, int index, int target,
vector<int>& vecCur, vector<vector<int> >& ans){
if(target < 0)
return;
if(target == 0){
if(!vecCur.empty())
ans.push_back(vecCur);
return;
}
if(index >= candidates.size())
return;
// choose candidates[index] more than times
int i = 1;
for(; i*candidates[index] <= target; i++){
vecCur.push_back(candidates[index]);
combinationSumBacktracking2(candidates, index+1, target - i*candidates[index], vecCur, ans);
}
for(int j=i-1; j>=1; j--)
vecCur.pop_back();
// don't choose candidates[index]
combinationSumBacktracking2(candidates, index+1, target, vecCur, ans);
}
};
int main()
{
return 0;
}
[array] leetcode - 39. Combination Sum - Medium的更多相关文章
- [array] leetcode - 40. Combination Sum II - Medium
leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...
- leetcode 39. Combination Sum 、40. Combination Sum II 、216. Combination Sum III
39. Combination Sum 依旧与subsets问题相似,每次选择这个数是否参加到求和中 因为是可以重复的,所以每次递归还是在i上,如果不能重复,就可以变成i+1 class Soluti ...
- [LeetCode] 39. Combination Sum 组合之和
Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), fin ...
- LeetCode 39. Combination Sum (组合的和)
Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique c ...
- Java [Leetcode 39]Combination Sum
题目描述: Given a set of candidate numbers (C) and a target number (T), find all unique combinations in ...
- LeetCode 39 Combination Sum(满足求和等于target的所有组合)
题目链接: https://leetcode.com/problems/combination-sum/?tab=Description Problem: 给定数组并且给定一个target,求出所 ...
- [LeetCode] 39. Combination Sum ☆☆☆(数组相加等于指定的数)
https://leetcode.wang/leetCode-39-Combination-Sum.html 描述 Given a set of candidate numbers (candidat ...
- Leetcode 39. Combination Sum
Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique c ...
- leetcode 39 Combination Sum --- java
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...
随机推荐
- linux服务器使用yum安装nginx
一,安装nginx和php-fpm yum install nginx php-fpm 二, 找到nginx.conf find / -name nginx.conf 三,添加解析php配置 在ser ...
- 用原型代替PRD时,原型应该包含哪些内容
随着互联网节奏越来越快,传统的需求文档已经比较难适应市场的脚步,特别对于要求敏捷的团队来说,冗余而细致入微的需求文档已经成为包袱(这么长个文档领导也不会看呀).目前大多数团队更喜爱直接使用原型来代替需 ...
- 关于springboot启动的问题.
IDE使用的是IDEA: 遇到的问题:使用springboot自带main方法无法启动示例,解决方案: 如果大家使用Application中的main方法无法正常启动时,可以去修改Project St ...
- NETStandard,NETFx,Mono,NETCore,ASPNetCore 之间关系的整理
因为现在很多人对这几者之间的关系还不甚了解,这里根据我所知来做一个大概的介绍...... .NET Standard: .NET标准,只要符合这个标准实现类库,即可在支持此标准的Run ...
- 一个部署了tomcat服务的linux服务器,运行一段时间后出现内存和空间不足的问题
—— 前段时间项目上的事比较忙,期间笔记都是临时存在本地txt,这些天有点时间了,整理出来,以便日后查看: linux 查看内存使用情况:free -m 释放缓存: /proc/sys/vm/drop ...
- cmd 更改计算机名
bat 更改计算机名 不用重启电脑就生效^_^ @Echo off Color 0A title --更改计算机名 :A cls echo. echo. [0]退出 echo. echo. 不用重启 ...
- svn 如果遇到an unversioned directory of the same name already exists的解决办法
svn 如果遇到an unversioned directory of the same name already exists的解决办法 一般这种情况是因为,在一个已经存在的文件夹里做SVN che ...
- 如果nginx启动失败,错误解决
解决上面问题: /usr/sbin/groupadd -f www /usr/sbin/useradd -g www www 这方法常见出现时反向代理时,ssl的授权用户不存在的情况下出现的:.
- IDEA 无法运行Junit, 报错Class not found xxxx Empty test suite.
网上搜了一圈没找到答案, 最后才发现是因为testmodule没有把class编译到主代码编译的路径.
- window.open()被拦截问题
最近做项目的时候遇到一个需求,在商品详情页面中点击购买按钮,之后再新标签页中打开生成的订单页面,所以想用window.open()来实现.但是测试的时候发现打开的链接被浏览器拦截. 之后,开始在网上查 ...