啊啊啊啊。好怀念这样的用递归保存路径然后打印出来的题目啊。好久没遇到了。

分了两种,一种是能够反复使用数组中数字的,一种是每一个数字仅仅能用一次的。事实上没有多大差别,第一种每次进入递归的时候都要从头開始尝试。另外一种要找一个标记的数组,把已经用到过的排除掉,就像生成全排列时的做法一样。

跟我一样用引用保存中间结果的话。要注意回退的情况。

另外一种回退时,要把用到的那个数也恢复为可用,就全然像全排列时做的一样。破例贴两个题的代码。由于他们是在是不值得用两片文章来写。

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的更多相关文章

  1. [Leetcode 39]组合数的和Combination Sum

    [题目] Given a set of candidate numbers (candidates) (without duplicates) and a target number (target) ...

  2. 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) ...

  3. 【Leetcode】【Medium】Combination Sum II

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

  4. 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 ...

  5. leetcode第一刷_Path Sum II

    在更新上面一道题的时候我就想,是不是另一道打印路径的,果不其然啊. 这样的题非经常见的,做法也非常easy,我是用一个引用的vector来存,满足条件之后直接压入结果集中,当然也能够用数组之类的,都一 ...

  6. 【LeetCode每天一题】Combination Sum II(组合和II)

    Given a collection of candidate numbers (candidates) and a target number (target), find all unique c ...

  7. leetcode第一刷_Minimum Path Sum

    能够用递归简洁的写出,可是会超时. dp嘛.这个问题须要从后往前算,最右下角的小规模是已知的,边界也非常明显,是最后一行和最后一列,行走方向的限制决定了这些位置的走法是唯一的,能够先算出来.然后不断的 ...

  8. leetcode第一刷_Permutations II

    当有反复元素的时候呢? 不用拍脑袋都会想到一种方法,也是全部有反复元素时的通用处理方法,维护一个set,假设这个元素没增加过就增加,增加过了的忽略掉.可是,在这道题上这个通用方法竟然超时了! 怎么办? ...

  9. leetcode第一刷_Populating Next Right Pointers in Each Node II

    很自然的推广,假设去掉全然二叉树的条件呢?由于这个条件不是关键,因此不会影响整体的思路.做法依旧是每次找到一层的起点,然后一层一层的走. 假设是全然二叉树的话,每层的起点就是上一层起点的左孩子,兄弟之 ...

随机推荐

  1. go chapter 5 - 异常处理 error、panic、recover

    https://blog.csdn.net/tennysonsky/article/details/78946265 error(不中断).panic(中断).recover(拦截中断  类似于 ca ...

  2. 洛谷——P1869 愚蠢的组合数

    P1869 愚蠢的组合数 题目描述 最近老师教了狗狗怎么算组合数,狗狗又想到了一个问题... 狗狗定义C(N,K)表示从N个元素中不重复地选取K个元素的方案数. 狗狗想知道的是C(N,K)的奇偶性. ...

  3. 设计模式-适配器模式(Adapter Pattern)

    本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 适配器模式简介 适配器模式的作用就如同现实生活中转接头的作用一样,现实生活中我们会用USB转接头 ...

  4. 解决phpStudy启动网站警告问题

    在用phpStudy的时候,在页面中会有一些警告 notice:Undefined variable... notice:Undefined index... 在php.ini里面找到 display ...

  5. 【大视野入门OJ】1083:数组的二分查找

    Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output ...

  6. 【tarjan+缩点】POJ1236[IOI1996]-Network of Schools

    [题意] 见:http://blog.csdn.net/ascii991/article/details/7466278 [思路] 缩点+tarjan,思路也可以到上面的博客去看.(吐槽:这道题其实我 ...

  7. Android手机 "已安装了存在签名冲突的同名数据包"

    如果你不是开发者:如果你在android上更新一个已经安装过较早版本软件时,安装到最后一步提示你:已安装了存在签名冲突的同名数据包,然后安装失败.这是因为旧版软件的签名信息与新版不一致造成的.你可以卸 ...

  8. mysql错误 Access denied for user 'root'@'xxx.xxx.xxx.xxx' (using password: YES)

    mysql -u root -p Aaa111222333 grant all privileges on *.* to root@'%' identified by 'aaa111222333; Q ...

  9. jquer总结

    前端jq总结 选择器********************************************************************** 1,基本选择 器 #id .clss ...

  10. HDU 4417 Super Mario(划分树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...