栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

39. 组合总和-java

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

39. 组合总和-java

 这是一道回溯的题目,深度优先搜索,难点是如何去掉重复的组合,对于[2,3,6,7] target = 7,[2,2,3]和[3,2,2]是重复的组合。在选数的时候给予限制,比如说第一个数选了3,第二个数只可以选3之后的数,即[6,7],如此可以限制重复的组合。

class Solution {

    List> ans;

    public List> combinationSum(int[] candidates, int target) {

        ans = new LinkedList<>();

        LinkedList l = new LinkedList<>();

        dfs(target, 0, l, candidates);

        return ans;

    }

    void dfs(int target, int begin, LinkedList l, int[] candidates) {

        //满足taget的一种组合数

        if(target == 0) {

            ans.add(new LinkedList(l));

            return;

        }

        //减枝,肯定不满足

        if(target < 0) {

            return;

        }

        System.out.println(target);

        //选数的下标是begin

        for(int i = begin; i < candidates.length; i++) {

            if(target >= candidates[i]) {

                l.add(candidates[i]);

                int temp = target - candidates[i];

                //下一次的begin穿的是当前层数的i,意味着下一次选数只能从i之后的位置选

                //避免出现重复的组合

                dfs(temp, i , l, candidates);

                l.remove(l.size() - 1);

            }

        }

        return;

    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1036073.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号