Find all possible combinations of k numbers that add up to a number n, given that only numbers from 1 to 9 can be used and each combination should be a unique set of numbers.
Ensure that numbers within the set are sorted in ascending order.
Example 1:
Input: k = 3, n = 7
Output:
[[1,2,4]]
Example 2:
Input: k = 3, n = 9
Output:
[[1,2,6], [1,3,5], [2,3,4]]
Have you met this question in a real interview?
题目分析:看到这个题目,直接反应就是递归,一个个数的找,找到了就添加,递归写顺了就比较简单,递归有3个地方要注意。
1.添加结果的时候,如果是引用,记得新建。
2.递归调用后记得要回溯
3. 递归要记得剪枝
做到这三条,递归绝对不是问题
代码如下:
public List<List<Integer>> combinationSum3(int k, int n) {
List<List<Integer>> res=new ArrayList<List<Integer>>();
List<Integer> list=new ArrayList<Integer>();
if(k<1||k>9||n>45) return res;
search(res,list,0,1,0,k,n);
return res;
}
//递归取值
public void search( List<List<Integer>> res,List<Integer> list,int sum,int index,int count,int k,int n)
{
if(sum==n&&count==k)
{
//一定要先建一个list
List<Integer> newlist=new ArrayList<Integer>();
newlist.addAll(list);
res.add(newlist);
return;
}
//注意剪枝
else if(index>9||count>k||sum>n)
{
return;
}
else if(count==k&&sum<n)
{
return;
}
for(int i=index;i<=9;i++)
{
if(sum+i<=n)
{
list.add(i);
search(res,list,sum+i,i+1,count+1,k,n);
list.remove(list.size()-1);
}
}
}