还是利用深搜的思想,注意一个元素可以取无数次。而LC40 Combination Sum II 就有次数限制,有次数限制的情况下可以先判断一个数是否与它前面的数相等,若相等则跳过该元素,直到找到一个数与它前面的数不等,再进行深搜。

这里附上LC39的代码

 1 class Solution {
 2 public:
 3     vector<vector<int>> result;
 4     void dfs(int start,int n,int target,vector<int>& cand,vector<int> record)
 5     {
 6         int tar;
 7         for(int i=start;i<n;i++)
 8         {
 9             tar=target;
10             vector<int> rec=record;
11             if(tar<cand[i])
12                 return;
13             while(tar>=cand[i])
14             {
15                 tar-=cand[i];
16                 rec.push_back(cand[i]);
17                 if(tar==0)
18                 {
19                     result.push_back(rec);
20                     break;
21                 }
22                 else if(tar<cand[i])
23                     break;
24                 dfs(i+1,n,tar,cand,rec);
25             }
26         }
27     }
28     vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
29         if(candidates.size()==0||target<=0)
30             return result;
31         sort(candidates.begin(),candidates.end());
32         vector<int> record;
33         dfs(0,candidates.size(),target,candidates,record);
34         return result;
35     }
36 };

View Code

附上一段更简洁的代码

 1 class Solution {
 2 public:
 3     vector<vector<int> > combinationSum(vector<int> &nums, int target) {
 4         sort(nums.begin(), nums.end());
 5         vector<vector<int> > result;
 6         vector<int> intermediate;
 7         dfs(nums, target, 0, intermediate, result);
 8         return result;
 9     }
10 private:
11     void dfs(vector<int>& nums, int gap, int start, vector<int>& intermediate,
12         vector<vector<int> > &result) {
13         if (gap == 0) {
14             result.push_back(intermediate);
15             return;
16         }
17         for (size_t i = start; i < nums.size(); i++) {
18             if (gap < nums[i]) return;
19             intermediate.push_back(nums[i]);
20             dfs(nums, gap - nums[i], i, intermediate, result);
21             intermediate.pop_back();
22         }
23     }
24 };

View Code

转载于:https://www.cnblogs.com/vaecn/p/5350152.html

LC39 Combination Sum相关推荐

  1. 40. Combination Sum II 组合总和 II

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...

  2. 216. Combination Sum III

    /** 216. Combination Sum III * 2016-6-12 by Mingyang* i一定要取到9,虽然大小聪明,想只取到7,但是后面的遍历可能也会遍历到9啊.* 1.长度标准 ...

  3. Combination Sum 和Combination Sum II

    这两道题的基本思路和combination那一题是一致的,也是分治的方法. 其中combination Sum复杂一点,因为每个数可能用多次.仔细分析下,本质上也是一样的.原来是每个数仅两种可能.现在 ...

  4. 【动态规划】LeetCode 377. Combination Sum IV

    LeetCode 377. Combination Sum IV Solution1: 我的未能AC的答案 题目描述的和前几道题差不多,但实际上不能用DFS来做(会超时),要用动态规划,还是记录一下吧 ...

  5. 【DFS】LeetCode 39. Combination Sum

    LeetCode 39. Combination Sum Solution1: DFS,这个套路要熟记啊! class Solution { public:vector<vector<in ...

  6. 36 数字组合(Combination Sum)

    文章目录 1 题目 2 解决方案 2.1 思路 2.2 图解 2.3 时间复杂度 2.4 空间复杂度 3 源码 1 题目 题目:数字组合(Combination Sum) 描述:给定一个候选数字的集合 ...

  7. 【LeetCode】#39组合总和(Combination Sum)

    [LeetCode]#39组合总和(Combination Sum) 加粗样式 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数 ...

  8. LeetCode Combination Sum IV(动态规划)

    问题:给出一个数组nums和目标数target,问有多少组合形式 思路:用dp(i)表示目标数target的组合数.则有状态转移关系为dp(i)=sum(dp(i-nums[j])),其中i>= ...

  9. LeetCode Combination Sum

    因为实验室项目好久没刷题了.从今天开始重新开始刷题. Given a set of candidate numbers (C) and a target number (T), find all un ...

最新文章

  1. mysql实现sass_使用sass绘制三角形
  2. linux下的hive命令大全,Hive shell 常用命令
  3. 取消管理员取得所有权_企业取得违约补偿款是否一律应缴增值税呢?
  4. spring-boot基础概念与简单应用
  5. SpringMVC原理及非注解配置详解
  6. 计算机应用专业特色建设情况,【计算机应用论文】计算机应用类专业建设和革新探索(共3022字)...
  7. 自动采集电脑壁纸PHP源码美化版
  8. Nodejs V8引擎 fast property lookup
  9. configure make make install in linux
  10. xilinx sdk在Debug模式下根据地址在内存里观察值
  11. 精益管理研究院陈逸超 | 用精益思维创造数据价值金矿
  12. 详细的568A和568B线序
  13. 【Android工具】神器来了,游戏安装加速器ourplay,重点:附赠强大免费gmail邮箱注册...
  14. unity 粒子插件_unity的基本认识——走进unity
  15. 分布式键值存储ETCD
  16. 关于App置灰黑白化的探索
  17. gnome桌面显示计算机,使用 GNOME 桌面
  18. 中国民航飞行学院人事薪资管理系统实践案例
  19. 做好如何融洽处理人际关系文章 把握是前言
  20. 全国二级c语言上机题库答案,二级C语言上机题库100题加答案

热门文章

  1. 用Ubuntu编写第一个C程序并预处理、编译、汇编、链接
  2. Vue路由重复点击报错解决
  3. 从阿里巴巴发行价看A股新股投资机会
  4. linux qt 背景图片,qt设置背景图片
  5. Struts原理与实践
  6. 光子计算机ppt,光量子计算机.ppt
  7. [回顾]清华申请退学博士作品:完全用Linux工作
  8. 通过IBM Cloud 部署云原生应用
  9. 相关搜索词的一种粗排方法
  10. 光刻技术-无掩模高精度激光直写