leetcode 216. 组合总和 III 思考分析
可能需要回顾的文章;
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 思考分析相关推荐
- Day25 LeetCode 216. 组合总和 III 17. 电话号码的字母组合
题目:216. 组合总和 III - 力扣(LeetCode) 思路: 1.递归函数参数和返回值:首先需要两个全局变量一维path数组和二维result数组,path数组用来收集路径上的元素,resu ...
- LeetCode—216. 组合总和 III
216. 组合总和 III 题目描述: 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9 每个数字 最多使用一次 返回 所有可能的有效组合的列表 .该列表不能包含相同的组 ...
- LeetCode 216组合总和III 17电话号码的字母组合
文章目录 216组合总和III c++ 代码实现 python 代码实现 17.电话号码的字母组合 c++ 代码实现 python代码实现 216组合总和III 找出所有相加之和为 n 的 k 个数的 ...
- LeetCode 216. 组合总和 III(排列组合 回溯)
1. 题目 找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. 示例 1: 输 ...
- Leetcode| 216. 组合总和III、17. 电话号码的字母组合 Day25
216. Combination Sum III 回溯 class Solution:def __init__(self):self.path = []self.res = []def backtra ...
- leetcode 40. 组合总和 II 思考分析
题目 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用 ...
- leetcode —— 216. 组合总和 III
找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. 示例 1: 输入: k = ...
- 代码随想录算法训练营day25| 216.组合总和III、17.电话号码的字母组合
Leetcode 216.组合总和III 题目链接 思路:回溯算法 代码: class Solution {List<Integer> path = new ArrayList<&g ...
- 代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合
LeetCode 216.组合总和III 链接:216. 组合总和 III 思路: 这道题目与77. 组合仅有一点不同,就是这道题目找到的组合的总和需要满足额外的条件.所以在递归终止条件里增加了一个条 ...
最新文章
- java代码(dex)注入
- 【组合数学】指数生成函数 ( 证明指数生成函数求解多重集排列 )
- .NET:命令行解析器介绍
- boost::polygon模块实现自定义点相关的测试程序
- 【Apache POI】Java 读取Excel文件
- SpringBoot高级消息-RabbitMQ运行机制
- http/https监控获取响应时间(DNS解析时间,RRT时间,服务器处理时间等)
- 质数——python代码赏析
- 软化边硬化边_夏天多给小朋友吃它,蛋白质是牛肉的3倍,老人吃还能软化血管...
- OpenCV中 IplImage 与 Mat的区别
- SQL Server 触发器 详细讲解
- Jmeter-【JSON Extractor】-响应结果中一级key取值
- javascript编写acm算法题
- 室内定位无GPS怎么办?阿木送来解决方案~
- java double 移位_【原创】Java移位运算
- 钟平逻辑英语语法_钟平逻辑英语教程视频1-5季全(含笔记 支持百度云)
- 最小平方误差算法(LMSE) python实现
- 网络共享时 计算机名如何设置方法,win7怎么在局域网共享文件夹|win7局域网共享设置方法...
- 从技术起源看TD-SCDMA的演进
- 爬虫反反爬学习资料整理