递归与排列组合

<p>216. Combination Sum III(https://leetcode.com/problems/combination-sum-iii/#/description
这是leetcode第216题。因为自己是做到这个题目才思考这个问题。而这个题目是非重复排列组合,所以就从非重复排列组合的开始说起吧。
</p>
<p>排列组合有两种递归的方法,而区别重复和非重复,只需要做很小的一点代码改动就可以了。</p>

非重复排列组合

方法1:

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

List<List<Integer>> re=new ArrayList<List<Integer>>();
    public void combine(int index,int k,int n,List<Integer> 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<List<Integer>> combinationSum3(int k, int n) {
        List<Integer> temp=new ArrayList<>();
        combine(1,k, n, temp);
        return re;
    }

方法2:

<p>思想:对于第index个元素,只查看放入这个元素或者不放入这两种情况,然后递归后面一个元素index+1。</br>
注意此方法需要remove元素。</p>

List<List<Integer>> re=new ArrayList<List<Integer>>();
    public void combine(int index,int k,int n,List<Integer> 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<List<Integer>> combinationSum3(int k, int n) {
        List<Integer> 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<List<Integer>> re=new ArrayList<List<Integer>>();
    public void combine(int index,int k,int n,List<Integer> 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<List<Integer>> combinationSum3(int k, int n) {
        List<Integer> 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<List<Integer>> re=new ArrayList<List<Integer>>();
    public void combine(int index,int k,int n,List<Integer> 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<List<Integer>> combinationSum3(int k, int n) {
        List<Integer> temp=new ArrayList<>();
        combine(1,k, n, temp);
        return re;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 1,916评论 0 2
  • 成为理想国的会员而有缘认识杨照,父女倆的《呼吸》为世界增添了一抹温柔的享受,那般恬淡与沉静,使浮躁无颜存留。故而我...
    一枝闲梅阅读 248评论 0 4
  • 不再去翻开昔日的笔记 它发黄的纸张 卷曲的页脚。 那里有 往日阳光中的一些灰尘 闪闪发亮 如夜里的星子。 脑海里起...
    半岛铁人阅读 249评论 0 4
  • 汪藻《己酉乱后寄常州使君侄》原诗、注释、翻译、赏析 【原文】:己酉乱后寄常州使君侄汪藻①草草官军渡,悠悠敌骑旋②。...
    xcy无名阅读 838评论 0 0