2020年9月11日 组合总和 IIIcombinationSum3
class Solution {
public List<List<Integer>> combinationSum3(int k, int n) {
}
}
解题思路:
今天这道题相比之前的两道题,他特点在于限制了长度,也就是说他必须是规定长度的组合,不允许多也不允许少,这一点该如何实现呢?
我的想法是,还是递归啊,每次递归一层就把这个长度-1,当长度为1的时候就要求数字必须为0,否则返回空链表。
而且这一次尝试一下使用全局变量来作为递归的参数,而不是使用传递参数的方式来实现。
代码实现:
虽然这一次的代码逻辑更加复杂了,但是经过了之前两天的训练,熟练度已经提高了不少。
class Solution {
int[] array={1,2,3,4,5,6,7,8,9};
public List<List<Integer>> combinationSum3(int k, int n) {
int len=array.length;
List<List<Integer>> res=new ArrayList<>();
//边界状态,如果长度为0,返回空字符串
if (k==0)
return res;
//先复制一份数组作为状态存在栈中
int[] arrayCopy=new int[len];
System.arraycopy(array,0 , arrayCopy, 0,len );
for (int i=0;len!=0;){
//求出差值
int cha=n-arrayCopy[i];
//差大于0,继续递归
if (cha>0){
//把全局的数组变为递归时需要的状态
int[] newArray=new int[len-1];
System.arraycopy(arrayCopy,1 ,newArray ,0 ,len-1);
//临时覆盖掉,进行递归
array=newArray;
//进行递归
List<List<Integer>> lists = combinationSum3(k - 1, cha);
//填上新值
for (List<Integer> list : lists) {
list.add(0,arrayCopy[i]);
}
//加入结果集
res.addAll(lists);
}
else if (cha==0&&k==1){
List<Integer> list=new ArrayList<>();
list.add(arrayCopy[i]);
res.add(list);
}
//数组变回原本的数组,并且需要除掉开头
array=new int[len-1];
System.arraycopy(arrayCopy, 1, array, 0, len-1);
len--;
arrayCopy=array;
}
return res;
}
}