从1-9找到k个数字组合和为n
来源:互联网 发布:航天数据股份有限公司 编辑:程序博客网 时间:2024/05/22 07:01
题目来自LeetCode Combination Sum III:在1-9数字中,不重复地选择k个数字,使其和为n。
使用backtracking方法,即先试第k个,然后改变第k-1个再试第k个,再改变第k-2个再继续试……
我们知道需要用到递归,但是要把递归函数设计成什么样呢,
首先确定结束递归的条件,当结果数组的元素个数为k,和为n时,结束递归,
但是不一定只有这一个答案,所以递归函数的最外层还是应该有for循环把全部元素遍历一遍,
遍历时有些情况也是明确不用继续下去的,比如超过k个元素或者和超过n时。
最后思路是先加入1,然后如果不到k个元素就加入2,以此类推,直到够了k个元素时for循环第k个元素,
如果和小于n,继续试第k个元素,
如果等于n就把这个结果加入结果集,继续第k-1位的遍历,
如果大于n就不继续进行对第k个元素的试探,转而试探第k-1个元素。
需要注意的地方是要想到每次递归时传入的n是改变的,要想到试探完一个元素之后就把它弹出。
每一个尝试都只考虑自己是否满足条件。满足就加入结果集,k不满足就试图增加元素,n不满足就换掉最后一位元素或者更换之前的元素继续,直到所有可能遍历结束。
class Solution {public: void trycmb(vector<vector<int>>& res, vector<int> cur, int k, int n) //结果集res,目前的尝试cur { if (cur.size() == k && n == 0)//每次递归传入的n都是减去了尝试的组合cur的前面元素的和,只留下最后一个位置的期望的大小 { res.push_back(cur); return; } if (cur.size() < k) { for (int i = cur.empty() ? 1 : cur.back() + 1; i <= 9; i++)//尝试当前组合cur的最后一个元素的大小 { if (i>n) break; cur.push_back(i); trycmb(res, cur, k, n - i); cur.pop_back();//如果这个值试过了,不管行不行都要遍历到下一个 } } } vector<vector<int>> combinationSum3(int k, int n) { vector<vector<int>> res; vector<int> cur; trycmb(res, cur, k, n); return res; }};
阅读全文
0 0
- 从1-9找到k个数字组合和为n
- 输入n,m,从1-n个数字里输出和为m的组合
- 给定2个数字,n,m,使得从1到n之间的数字组合,他们的和等于m,求所有组合
- 每天一道LeetCode-----找到有多少个组合加起来和是n,每个组合的数字只能是1或者2
- 在n个数字中,找出所有和为SUM的组合
- 每天一道LeetCode-----找到1,2,...,n这n个数所有的组合,每个组合有k个元素,且元素大小递增
- C++从1~m数字中任取k个元素,求所有组合算法
- 求从1,2...n中取任意个不重复的数和为m的所有组合
- EularProject 38:数字组合1-9分解为数字与1到n的乘积的和
- 输入m和n,从1,2,3...n中找出和为m的组合
- 从n个数字中选取m个数字的组合算法(不分序列)
- 输入n个整数,输出其中最小的k个。 例如输入1,2,3,4,5,6,7和8这8个数字, 则最小的4个数字为1,2,3和4
- 计算从N个数字中取K个数字的结果集
- 给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合
- 给定一个包含从0,1,2,...,n中取出的n个不同数字的数组,找到数组中缺少的数字。
- 剑指off-找到最小k个数字
- 在n个整数中找到相加之和为t的所有组合
- 编写算法输出从n个数中取k个(k小于等于n)的所有组合
- 博弈论模型(巴什博弈)
- ReLU激活函数:简单之美
- 数据结构实验之栈:行编辑器
- (转)AI泡沫已现:资金多而项目缺,周期长而营收难
- HDU
- 从1-9找到k个数字组合和为n
- 写程序判定大小端及利用位运算进行大小端转化
- Canvas 详解
- windows下控制鼠标移动和点击的c语言实现
- 基于前后端分离的身份认证方式——JWT
- Python Decorators入门 (一)
- Python玩转数据分析学习笔记-01基础
- ♪ ♩ ♫ 海的声音-从区块链技术映出的社会价值
- 入离职管理系统——如何实现多条件查询