经典的回溯算法题leetcode组合问题整理及思路代码详解

目录

组合问题

leetcode77题.组合

leetcode216题.组合总和III

leetcode40题.组合总和II

leetcode39题.组合总和


倘若各位不太清楚回溯算法可以去看我上一篇文章。

回溯算法详解-CSDN博客

组合问题

一般组合和排列类的问题我们都会转化成一个树形问题,更便于理解。

leetcode77题.组合

77. 组合 - 力扣(LeetCode)

题目:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

class Solution {
    // 创建存放结果集
    List<List<Integer>> res = new ArrayList<>();
    // 存放单个子集
    List<Integer> temp = new ArrayList<>();
    public List<List<Integer>> combine(int n, int k) {
        backTrace(n, k , 1);//index从1开始选,之后选2、选3
        return res;

    }
    //一般回溯操作没有返回值,index表示我们选到了哪里,比如我们选到了1、2、3
    void backTrace(int n, int k, int index){
        // 优化:称之为剪枝,看能否有k个元素可以选
        //选进去的元素 + 可选元素 < k
        if(temp.size() + (n - index + 1) < k){
            return;
        }
        // 结束条件:我们已经选了k个元素
        if(temp.size() == k){
            res.add(new ArrayList<>(temp));
            return;
        }

        // 从多个元素中逐一选择,从index到n就是我们的可选子集
        for(int i = index; i <= n; i++){
            // 选元素进行处理,比如选了1
            temp.add(i);
            // 继续下一层,即2、3、4
            backTrace(n, k, i + 1);
            // 撤销我们处理过的元素
            temp.remove(temp.size() - 1);

        }
    }
}

leetcode216题.组合总和III

216. 组合总和 III - 力扣(LeetCode)

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:

  • 只使用数字1到9
  • 每个数字最多使用一次

返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
解释:
1 + 2 + 4 = 7
没有其他符合的组合了。
class Solution {
    //保存最终的结果
    List<List<Integer>> res = new ArrayList<>();
    //临时的保存每一组成立的结果
    List<Integer> temp = new ArrayList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {

        backTrace(n, k, 1, 0);
        return res;
    }

    void backTrace(int n, int k, int index, int sum){
        // 优化剪枝
        if(sum > n){
            return;
        }
        //凑不到k个数-> 可选的数 + 已选的数 < k
        if((9 - index + 1) + temp.size() < k){
            return;
        }
        // 结束条件:已经选了k个数
        if(temp.size() == k){
            if(sum == n){
                res.add(new ArrayList<>(temp));
            }
            return;
        }
        // 回溯
        for(int i = index; i <= 9; i++){
            // 选其中一个元素
            temp.add(i);
            sum = sum + i;
            backTrace(n, k, i + 1, sum);
            // 撤销处理
            temp.remove(temp.size() - 1);
            sum = sum - i;
        }
    }
}

leetcode40题.组合总和II

40. 组合总和 II - 力扣(LeetCode)

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用一次 。

注意:解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
class Solution {
    //存结果的结果集
    List<List<Integer>> res = new ArrayList<>();
    //临时变量存子集
    List<Integer> temp = new ArrayList<>();
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates);//给数组排序
        backTrack(candidates, target, 0, 0);//index表示数组下标,从0开始
        return res;
    }
    /*
        怎么处理重复的组合
        1. 排序 [1, 1, 5, 6, 7, 10];
    */
    void backTrack(int[] candidates, int target, int index, int sum){
        
        //剪枝
        if(sum > target){
            return;
        }

        // 结束条件
        if(sum == target){
            res.add(new ArrayList<>(temp));
            return;
        }


        // 处理主要逻辑
        for(int i = index; i < candidates.length; i++){
            // 遇到重复的数就跳过,去掉重复的组合
            if(i > index && candidates[i] == candidates[i-1]){
                continue;
            }
            // 从多个元素选择一个
            temp.add(candidates[i]);
            sum = sum + candidates[i];
            backTrack(candidates, target, i + 1, sum);
            // 撤销之前的操作
            temp.remove(temp.size() - 1);
            sum = sum - candidates[i];
        }
    }
}

leetcode39题.组合总和

39. 组合总和 - 力扣(LeetCode)

给你一个 无重复元素 的整数数组 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 。
仅有这两种组合。 

class Solution {
    //存取结果
    List<List<Integer>> res = new ArrayList<>();
    //临时存取子集
    List<Integer> temp = new ArrayList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        backTrack(candidates, target, 0, 0);
        return res;
    }


    void backTrack(int[] candidates, int target, 0int index, int sum){
        // 剪枝
        if(sum > target){
            return;
        }

        // 结束条件
        if(sum == target){
            res.add(new ArrayList<>(temp));
            return;
        }


        // 处理主要逻辑
        for(int i = index; i < candidates.length; i++){
            // 从多个元素选择一个
            temp.add(candidates[i]);
            sum = sum + candidates[i];
            //可以重复选择i,所以不用i+1
            backTrack(candidates, target, i, sum);
            // 撤销之前的操作
            temp.remove(temp.size() - 1);
            sum = sum - candidates[i];
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/182132.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(二)C语言之变量与算数运算表达式概述

C语言之变量与算数运算表达式概述 一、华氏温度与摄氏温度对照二、代码概述三、练习 一、华氏温度与摄氏温度对照 #include <stdio.h>/*当华氏温度为 0,20,40,...300时&#xff0c;打印出华氏温度与摄氏温度对照表华氏温度与摄氏温度 C(5/9)(̧F-32) 其中C表示摄氏温度&…

CANdelaStudio 使用教程 1

文章目录 CANdelaStudio 软件下载CANdelaStudio 软件的权限View Edition 和 Admin Edition 区别&#xff1a;打开文件 CDD / CDDT 文件新建 CDD 文件新建 CDDT 文件CDD 和 CDDT 文件的区别 CANdelaStudio 软件下载 1、 来到 Vector 官网下载中心 https://www.vector.com/cn/zh…

机器学习【01】相关环境的安装

学习实例 参考资料&#xff1a;联邦学习实战{杨强}https://book.douban.com/subject/35436587/ 项目地址&#xff1a;https://github.com/FederatedAI/Practicing-Federated-Learning/tree/main/chapter03_Python_image_classification 一、环境准备 GPU安装CUDA、cuDNN pytho…

【Python】批量将PDG合成PDF,以及根据SS号重命名秒传的文件

目录 说明批量zip2pdf批量zip2pdf下载SS号重命名源代码SS号重命名源代码下载附录&#xff0c;水文年鉴 说明 1、zip2pdf是一个开源软件&#xff0c;支持自动化解压压缩包成PDG&#xff0c;PDG合成PDF&#xff0c;笔者在其基础上做了部分修改&#xff0c;支持批量转换。 2、秒…

23年下半年软考成绩查询时间是什么时候?

一、成绩查询时间 2023年下半年软考成绩查询时间预计2023年12月份公布&#xff0c;成绩查询入口为计算机技术职业资格网&#xff08;全国统一成绩查询时间&#xff0c;统一查询入口&#xff09;。 二、成绩查询方法 登陆中国计算机技术职业资格网&#xff0c;点击“成绩查询”…

【Python】Fastapi swagger-ui.css 、swagger-ui-bundle.js 无法加载,docs无法加载,redocs无法使用

使用fastapi的时候&#xff0c;swagger-ui.css 、swagger-ui-bundle.js、redoc.standalone.js 有时候无法加载&#xff08;国内环境原因或者是局域网屏蔽&#xff09;&#xff0c;此时就需要自己用魔法下载好对应文件&#xff0c;然后替换到fastapi里面去。 fastapi里面依靠这…

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示

通过ros系统中websocket中发送sensor_msgs::Image数据给web端显示 #include <ros/ros.h> #include <signal.h> #include <sensor_msgs/Image.h> #include <message_filters/subscriber.h> #include <message_filters/synchronizer.h> #include &…

人工智能今天能为你做什么?生成式人工智能如何改变技术文档领域

▲ 搜索“大龙谈智能内容”关注GongZongHao▲ 作者 | Fabrice Lacroix 大型语言模型&#xff08;LLM&#xff09;和生成式人工智能&#xff08;GenAI&#xff09;&#xff0c;尤其是ChatGPT&#xff0c;这些是引领科技革新的新兴技术。它们不仅在科技界引起了轩然大波&#x…

【C++】拷贝构造函数,析构函数详解!

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

【MATLAB源码-第87期】基于matlab的Q-learning算法栅格地图路径规划,自主选择起始点和障碍物。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Q-learning是一种无模型的强化学习算法&#xff0c;适用于有限的马尔可夫决策过程&#xff08;MDP&#xff09;。它的核心是学习一个动作价值函数&#xff08;action-value function&#xff09;&#xff0c;即Q函数&#xf…

脉冲幅度调制信号的功率谱计算

本篇文章是博主在通信等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在通信领域笔记&#xf…

12.docker的网络-host模式

1.docker的host网络模式简介 host模式下&#xff0c;容器将不会虚拟出自己的网卡、配置IP等&#xff0c;而是使用宿主机的IP和端口&#xff1b;也就说&#xff0c;宿主机的就是我的。 2. 以host网络模式创建容器 2.1 创建容器 我们仍然以tomcat这个镜像来说明一下。我们以h…

Python入门教程 | Python3 字典(dict)

Python3 字典 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 Python3中的字典是一种无序、可变、可迭代的数据结构&#xff0c;它由键&#xff08;key&#xff09;和对应的值&#xff08;value&#xff09;组成。字典在Python中被视为可变对象&#xff0c;这意…

离散下学期提纲

概览 Realtions(关系)Semigroups and Groups(群和半群)Groups and coding(群和码) Advanced Counting Techniques(高级计数技巧) Groups(图)Trees(树) 关系 Relations and their properties(关系及关系性质)n-ary relations and their applicaitons(n元关系及应用)Represent…

SQL LIKE 运算符:用法、示例和通配符解释

SQL中的LIKE运算符用于在WHERE子句中搜索列中的指定模式。通常与LIKE运算符一起使用的有两个通配符&#xff1a; 百分号 % 代表零个、一个或多个字符。下划线 _ 代表一个单个字符。 以下是LIKE运算符的用法和示例&#xff1a; 示例 选择所有以字母 “a” 开头的客户&#x…

飞翔的小鸟游戏

一.建一个bird的类&#xff0c;放入素材 二.代码 1.Bird类 package bird;import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.IOException;/** 小鸟类* */ public class Bird {int x;// 坐标int y;int width; // 宽高int height;BufferedIm…

机器学习---最大似然估计和贝叶斯参数估计

1. 估计 贝叶斯框架下的数据收集&#xff0c;在以下条件下我们可以设计一个可选择的分类器 : P(wi) (先验)&#xff1b;P(x | wi) (类条件密度) 但是。我们很少能够完整的得到这些信息! 从一个传统的样本中设计一个分类器&#xff1a; ①先验估计不成问题 ②对类条件密度…

ORB-SLAM3在windows11下的编译使用

01 写在前面 近期在学习SLAM&#xff0c;想部署一下ORB-SLAM3&#xff0c;但是自己电脑是win11系统&#xff0c;因此就想着在win11上部署一下。但是网上看了一些教程&#xff0c;有一些博客&#xff0c;但是可能不适合我这种情况把&#xff0c;就很纠结。先说下结果&#xff0…

LangChain的简单使用介绍

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

【源码分析】zeebe actor模型源码解读

zeebe actor 模型&#x1f64b;‍♂️ 如果有阅读过zeebe 源码的朋友一定能够经常看到actor.run() 之类的语法&#xff0c;那么这篇文章就围绕actor.run 方法&#xff0c;说说zeebe actor 的模型。 环境⛅ zeebe release-8.1.14 actor.run() 是怎么开始的&#x1f308; Lon…