当前位置: 首页 > news >正文

【回溯算法】 LCR 081. 组合总和

LCR 081. 组合总和

解题思路

  • 初始化一个空的列表 res 来存储所有满足条件的组合,以及一个空的列表 track 来跟踪当前正在构建的组合,同时还有一个整数 trackNum 来跟踪当前组合的总和。

  • 定义一个名为 combinationSum 的方法,该方法接受两个参数 candidates 和 target,分别表示候选数数组和目标值。

  • 在 combinationSum 方法内部,首先检查如果候选数数组为空,则直接返回一个空列表,因为无法从空数组中找出满足条件的组合。

  • 调用 backtrack 方法开始生成组合。

  • 在 backtrack 方法中,首先检查当前组合的总和是否等于目标值 target,如果是,则将当前组合添加到 res 中。

  • 如果当前组合的总和已经超过了目标值 target,则直接返回,因为后续选择会使总和更大,无法满足条件。

  • 遍历从 start 开始到数组末尾的所有元素,表示在当前位置做出选择。

  • 将选择的元素添加到 track 中,并更新 trackNum 的值。

  • 递归调用 backtrack 方法,传递相同的候选数数组和目标值,但起始位置更新为 i,表示可以重复选择当前元素。

  • 当递归调用返回后,撤销上一步的选择,即从 track 中移除最后一个元素,并更新 trackNum 的值。

  • 当遍历完成时,所有满足条件的组合都已经生成,最后将 res 返回作为结果。

class Solution {
    List<List<Integer>> res = new LinkedList<>();
    List<Integer> track = new LinkedList<>();
    int trackNum = 0;

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        if(candidates.length == 0){
            return new LinkedList<>();
        }

        backtrack(candidates,target,0);
        return res;
    }

    void backtrack(int[] candidates,int target,int start){

        // 子集满足条件 加入
        if(trackNum ==  target){
            res.add(new LinkedList<>(track));
        }

        if(trackNum > target){
            return;// 提前结束
        }

        for(int i = start; i < candidates.length;i++){
            // 进行选择
            track.addLast(candidates[i]);
            trackNum += candidates[i];

            backtrack(candidates,target,i);// 表示可以重复选择

            trackNum -= candidates[i];
            track.removeLast();
        }
    }
}

相关文章:

  • android 音频调试技巧
  • 米哈游(原神)终面算法原题
  • Flink从入门到实践(一):Flink入门、Flink部署
  • C++实现鼠标点击和获取鼠标位置(编译环境visual studio 2022)
  • SQL 表信息 | 统计 | 脚本
  • 【笔记】Helm-5 Chart模板指南-8 命名模板
  • QT学习(五)C++函数重载
  • SpringCloud--Eureka注册中心服务搭建注册以及服务发现
  • 基于OpenCV灰度图像转GCode的斜向扫描实现
  • Unity UGUI实现点击事件穿透
  • C++面试宝典第27题:完全平方数之和
  • 基于 Java 的小说阅读器小程序,附源码
  • PVST详解
  • CSS 闪电按钮效果
  • 【python】绘制春节烟花
  • Vagrant 虚拟机工具基本操作指南
  • Nginx反向代理WebSocket
  • SpringMVC-组件解析
  • [C#]winform制作仪表盘好用的表盘控件和使用方法
  • gtkmm 与 Cambalache 与 Gtk::Builder (新手向)_
  • 菏泽家长“付费查成绩”风波调查:免费功能被误读
  • 太空飞梭项目起火,南宁方特东盟神画:明火已扑灭,无人受伤
  • 苹果第二财季营收增长5%,受关税政策影响预计下一财季新增9亿美元成本
  • 魔都眼|静安光影派对五一启幕:苏河湾看徐悲鸿艺术画作
  • 辽宁省委书记、省长连夜赶赴辽阳市白塔区火灾事故现场,指导善后处置工作
  • 浙商银行外部监事高强无法履职:已被查,曾任建行浙江省分行行长