找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。
说明:
所有数字都是正整数。
解集不能包含重复的组合。
示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]
解题思路:其实这个题就是在递归参数设计上多加一个idx和nums数组,因为题目限制了只能用1-9这几个数字,至于递归条件和递归函数的写法参照前面的博客,思路还是先写递归框架在慢慢写递归条件和递归函数,结果拼接从来都不是重点。只是递归部分真的重要,除了参数设计,结果保存方法和递归函数里的参数都是有经验的,一切皆套路,打算再刷这个tag几题就开始刷别的题目了,反正就是递归搜索学好,动态规划OK,基本上就OK了。
class Solution {
List<List<Integer>> ans=new ArrayList<>();
boolean [] v=new boolean[100];
public void robot(int idx,int target,int k,int [] nums){
if(target==0&&k==0){
//拼凑答案
List<Integer> res=new ArrayList<>();
for(int i=0;i<nums.length;i++){
if(v[i])
res.add(nums[i]);
}
ans.add(res);
return;
}
if(idx>=nums.length||k<0||target<0)
return;
v[idx]=true;
robot(idx+1,target-nums[idx],k-1,nums);//取这个数
v[idx]=false;
robot(idx+1,target,k,nums);//不取这个数
}
public List<List<Integer>> combinationSum3(int k, int n) {
int [] nums=new int[9];
for(int i=0;i<9;i++)
nums[i]=i+1;
robot(0,n,k,nums);
return ans;
}
}