递归与排列组合

216. Combination Sum III(https://leetcode.com/problems/combination-sum-iii/#/description)
这是leetcode第216题。因为自己是做到这个题目才思考这个问题。而这个题目是非重复排列组合,所以就从非重复排列组合的开始说起吧。


排列组合有两种递归的方法,而区别重复和非重复,只需要做很小的一点代码改动就可以了。

非重复排列组合

方法1:

思想:对于第index个元素,依次查看后续每个元素index+i,尝试把他放入组合(尝试就是进行进一步递归)

List> re=new ArrayList>();
    public void combine(int index,int k,int n,List temp){
        if(n<0) return;
        if(k==0&&n==0){
            re.add(new ArrayList<>(temp));
            return;
        }
        if(k<=0) return;
        for(int i=index;i<10;i++){
            temp.add(i);
            combine(i+1,k-1, n-i,temp);
            temp.remove(temp.size()-1);
        }
        return;
    }
    public List> combinationSum3(int k, int n) {
        List temp=new ArrayList<>();
        combine(1,k, n, temp);
        return re;
    }

方法2:

思想:对于第index个元素,只查看放入这个元素或者不放入这两种情况,然后递归后面一个元素index+1。

注意此方法需要remove元素。

List> re=new ArrayList>();
    public void combine(int index,int k,int n,List temp){
        if(n<0) return;
        if(k==0&&n==0){
            re.add(new ArrayList<>(temp));
            return;
        }
        if(index>9) return;
        if(k<=0) return;
        temp.add(index);
        combine(index+1,k-1, n-index,temp);
        temp.remove(temp.size()-1);
        combine(index+1,k, n,temp);
        return;
    }
    public List> combinationSum3(int k, int n) {
        List temp=new ArrayList<>();
        combine(1,k, n, temp);
        return re;
    }

有重复排列组合

其实对照前面的非重复排列组合,写出有重复的已经非常的简单了

方法1:

改动的地方:combine(i+1,k-1,n-i,temp)变成combine(i,k-1, n-i,temp),因为第i个元素有可能重复被使用

List> re=new ArrayList>();
    public void combine(int index,int k,int n,List temp){
        if(n<0) return;
        if(k==0&&n==0){
            re.add(new ArrayList<>(temp));
            return;
        }
        if(k<=0) return;
        for(int i=index;i<10;i++){
            temp.add(i);
            combine(i,k-1, n-i,temp);
            temp.remove(temp.size()-1);
        }
        return;
    }
    public List> combinationSum3(int k, int n) {
        List temp=new ArrayList<>();
        combine(1,k, n, temp);
        return re;
    }

方法2:

改动的地方:combine(index+1,k-1, n-index,temp)变成combine(index,k-1, n-index,temp);因为第index个元素可能被重复使用

List> re=new ArrayList>();
    public void combine(int index,int k,int n,List temp){
        if(n<0) return;
        if(k==0&&n==0){
            re.add(new ArrayList<>(temp));
            return;
        }
        if(index>9) return;
        if(k<=0) return;
        temp.add(index);
        combine(index,k-1, n-index,temp);
        temp.remove(temp.size()-1);
        combine(index+1,k, n,temp);
        return;
    }
    public List> combinationSum3(int k, int n) {
        List temp=new ArrayList<>();
        combine(1,k, n, temp);
        return re;
    }

你可能感兴趣的:(递归与排列组合)