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

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

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

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

  1. class Solution {
  2. public:
  3. set<vector<int> > vis;
  4. bool used[1000];
  5. void getSum(vector<int> &num, vector<vector<int> > &res, vector<int> &tpres, int target){
  6. if(target == 0){
  7. vector<int> sortres = tpres;
  8. sort(sortres.begin(), sortres.end());
  9. if(vis.find(sortres) == vis.end()){
  10. vis.insert(sortres);
  11. res.push_back(sortres);
  12. }
  13. tpres.pop_back();
  14. return;
  15. }
  16. for(int i=0;i<num.size();i++){
  17. if(target<num[i]) continue;
  18. if(!used[i]){
  19. used[i] = 1;
  20. tpres.push_back(num[i]);
  21. getSum(num, res, tpres, target-num[i]);
  22. used[i] = 0;
  23. }
  24. }
  25. tpres.pop_back();
  26. }
  27. vector<vector<int> > combinationSum2(vector<int> &num, int target) {
  28. vector<vector<int> > res;
  29. if(num.size() <= 0) return res;
  30. vector<int> tpres;
  31. memset(used, 0, sizeof(used));
  32. getSum(num, res, tpres, target);
  33. return res;
  34. }
  35. };

  1. class Solution {
  2. public:
  3. set<vector<int> > vis;
  4. void getSum(vector<int> &candidates, vector<vector<int> > &res, vector<int> &tpres, int target){
  5. //cout<<target<<"*"<<endl;
  6. if(target<0){
  7. tpres.pop_back();
  8. return;
  9. }
  10. if(target == 0){
  11. vector<int> sortres = tpres;
  12. sort(sortres.begin(), sortres.end());
  13. if(vis.find(sortres) == vis.end()){
  14. res.push_back(sortres);
  15. //for(int i=0;i<tpres.size();i++)
  16. // cout<<tpres[i]<<" ";
  17. //cout<<endl;
  18. vis.insert(sortres);
  19. }
  20. tpres.pop_back();
  21. return;
  22. }
  23. for(int i=0;i<candidates.size();i++){
  24. if(target<candidates[i]) continue;
  25. tpres.push_back(candidates[i]);
  26. getSum(candidates, res, tpres, target-candidates[i]);
  27. //if(!tpres.empty()) tpres.pop_back();
  28. }
  29. if(!tpres.empty()) tpres.pop_back();
  30. }
  31. vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
  32. vector<vector<int> > res;
  33. vector<int> tpres;
  34. if(candidates.size()<=0) return res;
  35. getSum(candidates, res, tpres, target);
  36. return res;
  37. }
  38. };

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. 颜色分类(LintCode)

    颜色分类 给定一个包含红,白,蓝且长度为n的数组,将数组元素进行分类使相同颜色的元素相邻,并按照红.白.蓝的顺序进行排序. 我们可以使用整数0,1和2分别代表红,白,蓝. 样例   注意 不能使用代码 ...

  2. 洛谷——P1916 小书童——蚂蚁大战

    P1916 小书童——蚂蚁大战 题目背景 小A在你的帮助下,开始“刷题”,他在小书童里发现了一款叫“蚂蚁大战”(又称蛋糕保卫战)的游戏.(你懂得) 题目描述 游戏中会出现n只蚂蚁,分别有a1,a2…… ...

  3. android 项目 功能 源码 eclipse的

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha eclipse的

  4. [USACO 2017 Feb Gold] Tutorial

    Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h> using namespace std; #define X ...

  5. [BZOJ3131] [Sdoi2013]淘金

    [BZOJ3131] [Sdoi2013]淘金 Description 小Z在玩一个叫做<淘金者>的游戏.游戏的世界是一个二维坐标.X轴.Y轴坐标范围均为1..N.初始的时候,所有的整数坐 ...

  6. 【动态规划】Codeforces Round #406 (Div. 2) C.Berzerk

    有向图博弈问题. 能转移到一个必败态的就是必胜态. 能转移到的全是必胜态的就是必败态. 转移的时候可以用队列维护. 可以看这个 http://www.cnblogs.com/quintessence/ ...

  7. 1.4(SQL学习笔记)分组、子查询、联结、组合查询

    一.分组 建表及数据填充语句下载:链接: https://pan.baidu.com/s/1WHYafwqKJEKq1kDwCH_Zlg 提取码: 3wy4 1.1初识分组 分组是按照某一列,将该列中 ...

  8. Problem F: 零起点学算法42——多组测试数据输出II

    #include<stdio.h> int main() { ; while(scanf("%d%d%d",&a,&b,&c)!=EOF) { ...

  9. Codeforces Round #343 (Div. 2) E. Famil Door and Roads lca 树形dp

    E. Famil Door and Roads 题目连接: http://www.codeforces.com/contest/629/problem/E Description Famil Door ...

  10. Inno Setup入门(二十一)——Inno Setup类参考(7)

    复选框 复选框(CheckBox)用于多个并不互斥的几个选项中作出一个或者多选择,例如字体可以有粗体.斜体和下划线,这三种状态可以任意组合,像这样的选项可以采用复选框实现.Pascal脚本中对应的类是 ...