题目描述:
给一个正整数n,将其分解为k个数的加和,找出所有的k个数的组合,并且这些组合相互唯一,例如1,2,3和3,2,1视为同一组
算法思路:
当选择添加这k个数中的第m个数时,则第m个数可取的最小值为min(n-前m-1个数的加和-(n-m)*9,第m-1个数的取值+1),然后用递归的方式求解即可:
代码如下:
public static List<List<Integer>> combinationSum3(int k, int n) {
List<Integer> ls = new ArrayList<Integer>();
List<List<Integer>> result = new ArrayList<List<Integer>>();
if(k*9<n){
return result;
}
search(k,1,1,n,result,ls,0);
return result;
}
public static void search(int k,int i,int start,int n,List<List<Integer>> result,List<Integer> ls,int sum){
if(i==k+1 && sum==n){
List<Integer> temp = new ArrayList<Integer>(ls);
result.add(temp);
}
if(sum>n || i>k+1){
return ;
}
if(i<=k && sum<n){
int newStart = ((n-sum)-(k-i)*9)>start?((n-sum)-(k-i)*9):start;
for(int m = newStart;m<=9;m++){
ls.add(m);
search(k,i+1,m+1,n,result,ls,sum+m);
ls.remove(ls.size()-1);
}
}
}