可能需要回顾的文章;
leetcode 77. 组合 思考分析

1、题目

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。

2、递归

这一题和之前一题很像:
leetcode 77. 组合 思考分析
终止条件有两个:sum==n && res.size() == k
回溯的过程中加入对sum值的修改。
修改一下递归函数的参数值,这样,本题就做好了

class Solution {public:vector<vector<int>> result;vector<int> res;int sum;void clear_solution_param(){result.clear();res.clear();sum=0;}void backtracking(int start,int end,int k,int n){//找到了k个数if(res.size() == k && sum == n){result.push_back(res);return;}for(int i=start;i<=end;i++){//处理结点;res.push_back(i);sum+=i;//递归,探索下一层backtracking(i+1,end,k,n);      //递归sum-=i;//回溯,撤销处理结果res.pop_back();}}vector<vector<int>> combinationSum3(int k, int n) {clear_solution_param();backtracking(1,9,k,n);return result;}
};

3、剪枝优化

1、我们之前的终止条件其实限的有问题,如果res.size已经等于k了,那么就没必要继续搜索了,直接返回。sum是否等于n只是关系到我们是否得到正确答案。所以应该修改为:

if(res.size() == k)
{if(sum == n) result.push_back(res);return;           //如果size==k,但是sum!=n,直接返回
}

2、修改成上面那样其实还是有冗余,我们注意到,如果sum>n,此时也没有必要进行再次搜索了

if(sum>n) return;
if(res.size() == k)
{if(sum == n) result.push_back(res);return;           //如果size==k,但是sum!=n,直接返回
}

3、同leetcode 77. 组合 思考分析的剪枝操作:
我们已经选择的元素个数为:res.size()
我们还需要的元素的个数为k-res.size()
所以最多从end-(k-res.size())+1的地方开始遍历。

for(int i=start;i<=end-(k-res.size())+1;i++)
{//处理结点;res.push_back(i);sum+=i;//递归,探索下一层backtracking(i+1,end,k,n);      //递归sum-=i;//回溯,撤销处理结果res.pop_back();
}

4、最终代码:

class Solution {public:vector<vector<int>> result;vector<int> res;int sum;void clear_solution_param(){result.clear();res.clear();sum=0;}void backtracking(int start,int end,int k,int n){if(sum>n) return;if(res.size() == k){if(sum == n) result.push_back(res);return;          //如果size==k,但是sum!=n,直接返回}for(int i=start;i<=end-(k-res.size())+1;i++){//处理结点;res.push_back(i);sum+=i;//递归,探索下一层backtracking(i+1,end,k,n);      //递归sum-=i;//回溯,撤销处理结果res.pop_back();}}vector<vector<int>> combinationSum3(int k, int n) {clear_solution_param();backtracking(1,9,k,n);return result;}
};

leetcode 216. 组合总和 III 思考分析相关推荐

  1. Day25 LeetCode 216. 组合总和 III 17. 电话号码的字母组合

    题目:216. 组合总和 III - 力扣(LeetCode) 思路: 1.递归函数参数和返回值:首先需要两个全局变量一维path数组和二维result数组,path数组用来收集路径上的元素,resu ...

  2. LeetCode—216. 组合总和 III

    216. 组合总和 III 题目描述: 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 .该列表不能包含相同的组 ...

  3. LeetCode 216组合总和III 17电话号码的字母组合

    文章目录 216组合总和III c++ 代码实现 python 代码实现 17.电话号码的字母组合 c++ 代码实现 python代码实现 216组合总和III 找出所有相加之和为 n 的 k 个数的 ...

  4. LeetCode 216. 组合总和 III(排列组合 回溯)

    1. 题目 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. 示例 1: 输 ...

  5. Leetcode| 216. 组合总和III、17. 电话号码的字母组合 Day25

    216. Combination Sum III 回溯 class Solution:def __init__(self):self.path = []self.res = []def backtra ...

  6. leetcode 40. 组合总和 II 思考分析

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

  7. leetcode —— 216. 组合总和 III

    找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. 示例 1: 输入: k = ...

  8. 代码随想录算法训练营day25| 216.组合总和III、17.电话号码的字母组合

    Leetcode 216.组合总和III 题目链接 思路:回溯算法 代码: class Solution {List<Integer> path = new ArrayList<&g ...

  9. 代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合

    LeetCode 216.组合总和III 链接:216. 组合总和 III 思路: 这道题目与77. 组合仅有一点不同,就是这道题目找到的组合的总和需要满足额外的条件.所以在递归终止条件里增加了一个条 ...

最新文章

  1. java代码(dex)注入
  2. 【组合数学】指数生成函数 ( 证明指数生成函数求解多重集排列 )
  3. .NET:命令行解析器介绍
  4. boost::polygon模块实现自定义点相关的测试程序
  5. 【Apache POI】Java 读取Excel文件
  6. SpringBoot高级消息-RabbitMQ运行机制
  7. http/https监控获取响应时间(DNS解析时间,RRT时间,服务器处理时间等)
  8. 质数——python代码赏析
  9. 软化边硬化边_夏天多给小朋友吃它,蛋白质是牛肉的3倍,老人吃还能软化血管...
  10. OpenCV中 IplImage 与 Mat的区别
  11. SQL Server 触发器 详细讲解
  12. Jmeter-【JSON Extractor】-响应结果中一级key取值
  13. javascript编写acm算法题
  14. 室内定位无GPS怎么办?阿木送来解决方案~
  15. java double 移位_【原创】Java移位运算
  16. 钟平逻辑英语语法_钟平逻辑英语教程视频1-5季全(含笔记 支持百度云)
  17. 最小平方误差算法(LMSE) python实现
  18. 网络共享时 计算机名如何设置方法,win7怎么在局域网共享文件夹|win7局域网共享设置方法...
  19. 从技术起源看TD-SCDMA的演进
  20. 爬虫反反爬学习资料整理

热门文章

  1. 我是如何使用git把本地代码上传到github上的,值得借鉴
  2. 批处理停止php服务,通过批处理启动和停止MSSQL+IIS
  3. java两个字符串前缀_java – 找到两个字符串的最长公共前缀
  4. ie 浏览器布局中的 offset
  5. sqlserver 多表更新
  6. iOS开发之Masonry框架-使用方法须知
  7. 2018-05-05(在小程序中使用图标)
  8. (转)求单链表是否有环,环入口和环长
  9. PHP 性能分析: Xhprof Xhgui
  10. Mysql 的一些基本用法