【Leetcode 39】组合总和 —— 回溯法

39. 组合总和

给你一个无重复元素的整数数组candidates和一个目标整数target ,找出candidates中可以使数字和为目标数target的 所有不同组合,并以列表形式返回。你可以按**任意顺序 **返回这些组合。

candidates中的同一个数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为target的不同组合数少于150个。

示例 1:

输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。

题目分析

回溯法解题步骤

  1. 针对所给问题,定义问题的解空间
  2. 确定易于搜索的解空间结构
  3. 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索

回溯法有“通用解题法”之称,用它可以系统地搜索问题的所有解。回溯法是一个既带有系统性又带有跳跃性的搜索算法。
详细可见 Leetcode 回溯法详解

经典排列树,按节点遍历,更多案例可见 Leetcode 回溯法详解

class Solution {
   
    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
   
        Arrays.sort(candidates);
        backtrack(candidates, 0, new ArrayList<>(), target);
        return res;
    }

    /**
     * output(x)     记录或输出得到的可行解x
     * constraint(t) 当前结点的约束函数
     * bount(t)      当前结点的限界函数
     * @param t  t为当前解空间的层数
     */
    private void backtrack(int[] nums, int k, List<Integer> temp, int target) {
   
        // bount
        if (target == 0) {
   
            res.add(new ArrayList<>(temp));
            return;
        } else if (target < 0) {
   
            return;
        }

        for (int i = k; i < nums.length; ++i) {
   
            // 剪枝
            if (target - nums[i] < 0) {
   
                break;
            }
            temp.add(nums[i]);
            backtrack(nums, i, temp, target - nums[i]);
            temp.remove(temp.size() - 1);
        }
    }
}

相关推荐

  1. 回溯Leetcode 39. 组合总和【中等】

    2023-12-30 06:34:05       42 阅读
  2. 组合总和(Lc39)——排序+剪枝+回溯

    2023-12-30 06:34:05       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-30 06:34:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-30 06:34:05       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-30 06:34:05       82 阅读
  4. Python语言-面向对象

    2023-12-30 06:34:05       91 阅读

热门阅读

  1. 聊聊PowerJob的StoreStrategy

    2023-12-30 06:34:05       55 阅读
  2. go语言设计模式-单例模式

    2023-12-30 06:34:05       44 阅读
  3. WPF 基础入门 (触发器)

    2023-12-30 06:34:05       57 阅读
  4. oj习题8577 合并顺序表

    2023-12-30 06:34:05       47 阅读
  5. 使用 Docker Compose 部署 Halo 2.x 与 MySQL

    2023-12-30 06:34:05       66 阅读
  6. Rust在写库时实现缓存

    2023-12-30 06:34:05       63 阅读
  7. (一)window使用VMware运行Centos7

    2023-12-30 06:34:05       63 阅读
  8. spring boot使用配置文件对静态变量进行赋值

    2023-12-30 06:34:05       62 阅读