经典的回溯算法题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、选3return res;}//一般回溯操作没有返回值,index表示我们选到了哪里,比如我们选到了1、2、3void backTrace(int n, int k, int index){// 优化:称之为剪枝,看能否有k个元素可以选//选进去的元素 + 可选元素 < kif(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++){// 选元素进行处理,比如选了1temp.add(i);// 继续下一层,即2、3、4backTrace(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个数-> 可选的数 + 已选的数 < kif((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+1backTrack(candidates, target, i, sum);// 撤销之前的操作temp.remove(temp.size() - 1);sum = sum - candidates[i];}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Typecho搭建个人博客网站,并内网穿透实现公网访问

使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问 文章目录 使用Typecho搭建个人博客网站&#xff0c;并内网穿透实现公网访问前言1. 安装环境2. 下载Typecho3. 创建站点4. 访问Typecho5. 安装cpolar6. 远程访问Typecho7. 固定远程访问地址8. 配置typecho 前言 …

通过CLSID修改Windows右键菜单顺序

效果 排序顺序&#xff1a; 上下文菜单分为3个区&#xff1a; 2 - 默认菜单部分 (在顶部). 1 - 发送到、复制到、移动到 菜单部分(在中间). 0 - 重命名菜单部分 (在底部). 调整菜单步骤&#xff1a; 打开regeditHKEY_CLASSES_ROOT > CLSID 键.在 CLSID, 寻找你想修改位置…

机器学习【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…

JavaScript基础—引入方式、注释和结束符、输入和输出、变量、常量、数据类型、检测数据类型、类型转换、综合案例—用户订单信息

版本说明 当前版本号[20231123]。 版本修改说明20231123初版 目录 文章目录 版本说明目录JavaScript 基础 - 第1天介绍引入方式内部方式外部形式 注释和结束符单行注释多行注释 结束符输入和输出输出输入 变量声明赋值变量初始化更新变量 关键字变量名命名规则 常量数据类型…

深度之眼Paper带读笔记GNN.08.GCN(下)

文章目录 前言细节四&#xff1a;卷积核介绍图卷积核初代目图卷积核二代目契比雪夫多项式例子小结 GCN公式推导 实验设置和结果分析数据集节点分类任务消息传递方式比较运行效率 总结关键点创新点启发点 代码复现train.pyutil.pymodel.pylayer.py 作业 前言 本课程来自深度之眼…

【C++】POCO学习总结(五):功能介绍

【C】郭老二博文之&#xff1a;C目录 1、POCO 简介 github&#xff1a;https://github.com/pocoproject/poco 官网&#xff1a;https://pocoproject.org/index.html POCO第一个版本于 2005 年 2 月发布 POCO完全免费&#xff1a;POCO C 库根据 Boost 软件许可证获得许可。非…

Vue框架学习笔记——Vue实例中el和data的两种写法

文章目录 前文提要Vue实例的el第一种写法第二种写法小结 Vue实例中data第一种写法&#xff0c;对象式效果图片第二种写法&#xff0c;函数式效果图片小结 前文提要 本文仅做自己的学习记录&#xff0c;如有错误&#xff0c;请多谅解 Vue实例的el 第一种写法 <body><…

spring 是如何开启事务的, 核心原理是什么

文章目录 spring 是如何开启事务的核心原理1 基于注解开启事务2 基于代码来开启事务 spring 是如何开启事务的 核心原理 Spring事务管理的实现有许多细节&#xff0c;如果对整个接口框架有个大体了解会非常有利于我们理解事务&#xff0c;下面通过讲解Spring的事务接口来了解…

【CCF-PTA】第03届Scratch第04题 -- 数字加密

数字加密 【题目描述】 "狼群战术"是第二次世界大战中德军对大西洋上盟军商船所使用的潜艇战术&#xff0c;一度遏制住英国的海上贸易。直到艾伦图灵成功破译了德国的英格尔码密码&#xff0c;成为二战的一个重要转折点。时至今日&#xff0c;图灵仍然是计算机的一…

【数据结构/C++】线性表_顺序表的基本操作

#include <iostream> using namespace std; #define MaxSize 10 // 1. 顺序表 // 静态分配 typedef struct {int data[MaxSize];int length; // 当前长度 } SqList; // 静态分配初始化顺序表 void InitList(SqList &L) {for (int i 0; i < MaxSize; i){L.data[i]…

k8s-pod生命周期 4

容器环境初始化 pod 由pod 镜像来提供&#xff0c;在pod 生命周期里容器主要分为两种&#xff1a;初始化容器和主容器 初始化容器一定要成功运行并退出&#xff0c;当初始化容器运行退出完了之后主容器开始和运行 主容器开始运行的时候&#xff0c;有两个探针&#xff1a;存…

漏洞盒子公益SRC

漏洞盒子公益SRC&#xff0c;小小地记录一下第一个月的成果