每日一题算法:2020年9月11日 [组合总和 III] combinationSum3

2020年9月11日 组合总和 IIIcombinationSum3

每日一题算法:2020年9月11日 [组合总和 III] combinationSum3_第1张图片

class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {

    }
}

解题思路:

今天这道题相比之前的两道题,他特点在于限制了长度,也就是说他必须是规定长度的组合,不允许多也不允许少,这一点该如何实现呢?

我的想法是,还是递归啊,每次递归一层就把这个长度-1,当长度为1的时候就要求数字必须为0,否则返回空链表。

而且这一次尝试一下使用全局变量来作为递归的参数,而不是使用传递参数的方式来实现。

代码实现:
每日一题算法:2020年9月11日 [组合总和 III] combinationSum3_第2张图片

虽然这一次的代码逻辑更加复杂了,但是经过了之前两天的训练,熟练度已经提高了不少。

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;

    }
}

你可能感兴趣的:(每日一题算法,leetcode,算法)