从1~9中找出所有可能的k个数的组合,使其和为n。
采取递归的思路,传递还需要的数字个数k,数字和n,递归到哪一个数st以及当前的组合list。 通过循环(st->n/k)来作为当前可能可以插入的值继续递归下去直到k为1,判断剩余的n能否被插入,能则加入一个可能的结果到rt。 这里每一轮循环都只到n/k,保证了这一轮选的数肯定能小于后面要选的数。
public class Solution {
List<List<Integer>> rt = new ArrayList<List<Integer>>();
public List<List<Integer>> combinationSum3(int k, int n) {
fun( k,n,1,new ArrayList<Integer>() );
return rt;
}
void fun(int k,int n,int st,List<Integer> list )
{
if( n<0 )
{
return ;
}
if( k==1 )
{
if( n>=10 || n<st )
{
return ;
}
list.add(n);
rt.add(list);
return ;
}
for( int i=st;i<10&&i<=n/k;i++ )
{
List<Integer> tmp = new ArrayList<Integer>(list);
tmp.add(i);
fun(k-1,n-i,i+1,tmp);
}
}
}