zoukankan      html  css  js  c++  java
  • leetcode 39 组合总和

    package com.example.lettcode.dailyexercises;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * @Class CombinationSum
     * @Description 39 组合总和
     * 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
     * candidates 中的数字可以无限制重复被选取。
     * 说明:
     * 所有数字(包括 target)都是正整数。
     * 解集不能包含重复的组合。
     * <p>
     * 示例 1:
     * 输入:candidates = [2,3,6,7], target = 7,
     * 所求解集为:
     * [
     * [7],
     * [2,2,3]
     * ]
     * <p>
     * 示例 2:
     * 输入:candidates = [2,3,5], target = 8,
     * 所求解集为:
     * [
     *   [2,2,2,2],
     *   [2,3,3],
     *   [3,5]
     * ]
     * 提示:
     * 1 <= candidates.length <= 30
     * 1 <= candidates[i] <= 200
     * candidate 中的每个元素都是独一无二的。
     * 1 <= target <= 500
     * @Author
     * @Date 2020/9/9
     **/
    public class CombinationSum {
        public static List<List<Integer>> combinationSum(int[] candidates, int target) {
            List<List<Integer>> ans = new ArrayList<List<Integer>>();
            List<Integer> combine = new ArrayList<Integer>();
            dfs(candidates, target, ans, combine, 0);
            return ans;
        }
    
        /**
         * 回溯算法
         * @param candidates
         * @param target 目标数
         * @param ans 最终结果
         * @param combine 用于保存每一组的数据
         * @param idx 遍历到的位置
         */
        public static void dfs(int[] candidates, int target, List<List<Integer>> ans, List<Integer> combine, int idx) {
            if (idx == candidates.length) {
                return;
            }
            if (target == 0) {
                ans.add(new ArrayList<Integer>(combine));
                return;
            }
            // 选择当前数
            if (target - candidates[idx] >= 0) {
                combine.add(candidates[idx]);
                dfs(candidates, target - candidates[idx], ans, combine, idx);
                combine.remove(combine.size() - 1);
            }
            // 直接跳过
            dfs(candidates, target, ans, combine, idx + 1);
        }
    
        public static void main(String[] args) {
            int[] candidates = new int[]{2, 3, 6, 7};
            int target = 7;
            List<List<Integer>> res = combinationSum(candidates, target);
            System.out.println("CombinationSum demo01 result:");
            for (List<Integer> integerList : res) {
                for (Integer integer : integerList) {
                    System.out.print("," + integer);
                }
                System.out.println();
            }
    
            candidates = new int[]{2,3,5};
            target = 8;
            res = combinationSum(candidates, target);
            System.out.println("CombinationSum demo02 result:");
            for (List<Integer> integerList : res) {
                for (Integer integer : integerList) {
                    System.out.print("," + integer);
                }
                System.out.println();
            }
        }
    }
    
  • 相关阅读:
    机器学习: t-Stochastic Neighbor Embedding 降维算法 (二)
    数学辨异 —— 泰勒展开与等比数列求和
    HDU 4705 Y
    C#实现的内存分页机制的一个实例
    java程序获得SqlServer数据表的表结构
    GLSL中的各种变量总结
    HTTP协议学习
    Jedis中的一致性hash
    C语言数据结构----双向链表
    ios7毛玻璃效果实现
  • 原文地址:https://www.cnblogs.com/fyusac/p/13640705.html
Copyright © 2011-2022 走看看