leetcode第一刷_Combination Sum Combination Sum II
啊啊啊啊。好怀念这样的用递归保存路径然后打印出来的题目啊。好久没遇到了。
分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的。事实上没有多大差别,第一种每次进入递归的时候都要从头開始尝试。另外一种要找一个标记的数组,把已经用到过的排除掉,就像生成全排列时的做法一样。
跟我一样用引用保存中间结果的话。要注意回退的情况。
另外一种回退时,要把用到的那个数也恢复为可用,就全然像全排列时做的一样。破例贴两个题的代码。由于他们是在是不值得用两片文章来写。
class Solution {
public:
set<vector<int> > vis;
bool used[1000];
void getSum(vector<int> &num, vector<vector<int> > &res, vector<int> &tpres, int target){
if(target == 0){
vector<int> sortres = tpres;
sort(sortres.begin(), sortres.end());
if(vis.find(sortres) == vis.end()){
vis.insert(sortres);
res.push_back(sortres);
}
tpres.pop_back();
return;
}
for(int i=0;i<num.size();i++){
if(target<num[i]) continue;
if(!used[i]){
used[i] = 1;
tpres.push_back(num[i]);
getSum(num, res, tpres, target-num[i]);
used[i] = 0;
}
}
tpres.pop_back();
}
vector<vector<int> > combinationSum2(vector<int> &num, int target) {
vector<vector<int> > res;
if(num.size() <= 0) return res;
vector<int> tpres;
memset(used, 0, sizeof(used));
getSum(num, res, tpres, target);
return res;
}
};
class Solution {
public:
set<vector<int> > vis;
void getSum(vector<int> &candidates, vector<vector<int> > &res, vector<int> &tpres, int target){
//cout<<target<<"*"<<endl;
if(target<0){
tpres.pop_back();
return;
}
if(target == 0){
vector<int> sortres = tpres;
sort(sortres.begin(), sortres.end());
if(vis.find(sortres) == vis.end()){
res.push_back(sortres);
//for(int i=0;i<tpres.size();i++)
// cout<<tpres[i]<<" ";
//cout<<endl;
vis.insert(sortres);
}
tpres.pop_back();
return;
}
for(int i=0;i<candidates.size();i++){
if(target<candidates[i]) continue;
tpres.push_back(candidates[i]);
getSum(candidates, res, tpres, target-candidates[i]);
//if(!tpres.empty()) tpres.pop_back();
}
if(!tpres.empty()) tpres.pop_back();
}
vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
vector<vector<int> > res;
vector<int> tpres;
if(candidates.size()<=0) return res;
getSum(candidates, res, tpres, target);
return res;
}
};
leetcode第一刷_Combination Sum Combination Sum II的更多相关文章
- [Leetcode 39]组合数的和Combination Sum
[题目] Given a set of candidate numbers (candidates) (without duplicates) and a target number (target) ...
- LeetCode解题报告—— Combination Sum & Combination Sum II & Multiply Strings
1. Combination Sum Given a set of candidate numbers (C) (without duplicates) and a target number (T) ...
- 【Leetcode】【Medium】Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...
- Combination Sum,Combination Sum II,Combination Sum III
39. Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique co ...
- leetcode第一刷_Path Sum II
在更新上面一道题的时候我就想,是不是另一道打印路径的,果不其然啊. 这样的题非经常见的,做法也非常easy,我是用一个引用的vector来存,满足条件之后直接压入结果集中,当然也能够用数组之类的,都一 ...
- 【LeetCode每天一题】Combination Sum II(组合和II)
Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...
- leetcode第一刷_Minimum Path Sum
能够用递归简洁的写出,可是会超时. dp嘛.这个问题须要从后往前算,最右下角的小规模是已知的,边界也非常明显,是最后一行和最后一列,行走方向的限制决定了这些位置的走法是唯一的,能够先算出来.然后不断的 ...
- leetcode第一刷_Permutations II
当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...
- leetcode第一刷_Populating Next Right Pointers in Each Node II
很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...
随机推荐
- Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Office Keys(思维)
Office Keys time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- Xamarin中Unsupported major.minor version 52.0问题解决
Xamarin中Unsupported major.minor version 52.0问题解决 出现这种问题,是由于所使用的Java代码使用Java 8所才具有的特性.这个时候,需要将JDK升级到J ...
- 【BZOJ 2791】 2791: [Poi2012]Rendezvous (环套树、树链剖分LCA)
2791: [Poi2012]Rendezvous Description 给定一个n个顶点的有向图,每个顶点有且仅有一条出边.对于顶点i,记它的出边为(i, a[i]).再给出q组询问,每组询问由两 ...
- [BZOJ4819][SDOI2017]新生舞会(分数规划+费用流,KM)
4819: [Sdoi2017]新生舞会 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1097 Solved: 566[Submit][Statu ...
- 【数论】【ex-BSGS】poj3243 Clever Y
用于求解高次同余方程A^x≡B(mod C),其中C不一定是素数. http://blog.csdn.net/tsaid/article/details/7354716 这篇题解写得最好. 那啥,这题 ...
- [USACO13NOV]No Change
题目大意: 你有k(k<=16)个硬币,每个硬币都有自己的面值. 现在你要给n件商品付钱,每件商品也有自己的价格. 然而老板是个奸商,他绝对不会给你找钱. 你每次付钱只能用一个硬币,但是你可以一 ...
- Java高级架构师(一)第35节:Nginx的Location区段
没有修饰符 表示:必须以指定模式开始. 表示/abc下的所有内容都可以被访问. = 表示与指定的模式精确匹配,可以带参数. 实例中要求区分大小写,并以c结尾. 实例中指定的正则表达式不区分大小写. 注 ...
- [典型漏洞分享]Insert型SQL注入的发现和利用,篡改订单金额
本例中的SQL注入和其它发现的SQL注入的主要区别:1.生成订单接口是一次性的,反复提交无效,因此,此类型的SQL注入比较难通过扫描器发现,需要人工提取和手动测试.2.Insert类型的SQL注入,不 ...
- Visual Studio Image Library现在带矢量图标了
Visual Studio Image Library是微软提供的一套不可多得的高质量图标库(Visual Studio中自己使用的),我在自己写的一些小程序中一直有用到它们.今天天想把之前的程序中的 ...
- IIS配置Asp.net时,出现“未能加载文件或程序集“System.Web.Extensions.Design, Version=1.0.61025.0”
如果出现未能加载文件或程序集“System.Web.Extensions.Design, Version=1.0.61025.0, 主要是没有安装.net framwork 3.5,安装一下就行了. ...