经典的回溯算法题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.mzph.cn/news/164328.shtml

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

相关文章

26. 删除有序数组中的重复项(remove-duplicates-from-sorted-array)

26. 删除有序数组中的重复项(remove-duplicates-from-sorted-array) 给你一个 非严格递增排列 的数组 nums &#xff0c;请你** 原地** 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 …

批量创建表空间数据文件(DM8:达梦数据库)

DM8:达梦数据库 - - 批量创建表空间数据文件 环境介绍1 批量创建表空间SQL2 达梦数据库学习使用列表 环境介绍 在某些场景(分区表子表)需要批量创建表空间,给不同的表使用,以下代码是批量创建表空间的SQL语句; 1 批量创建表空间SQL --创建 24个数据表空间,每个表空间有3个数…

强化学习小笔记 —— 如何选择合适的更新步长

在强化学习中&#xff0c;动作价值函数的更新可以使用增量法&#xff0c;如下所示&#xff1a; Q k 1 k ∑ i 1 k r i 1 k ( r k ∑ i 1 k − 1 r i ) 1 k ( r k ( k − 1 ) Q k − 1 ) 1 k ( r k k Q k − 1 − Q k − 1 ) Q k − 1 1 k [ r k − Q k − 1 ] \beg…

Linux宝塔面板搭建Discuz论坛, 并内网穿透实现公网访问

Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问 文章目录 Linux宝塔面板搭建Discuz论坛&#xff0c; 并内网穿透实现公网访问前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 &#x1f4f7; 江池…

低代码平台推荐:五大低代码厂商谁的模式更“合适”

随着数字化时代的到来&#xff0c;低代码开发平台作为提高数字生产力的工具正受到越来越多企业的关注&#xff0c;市面上的低代码产品和厂商更是“乱花渐欲迷人眼”。 各家产品不仅功能各有不同&#xff0c;甚至商机都有区别的情况&#xff0c;如何做好产品选型已然成了采购企…

C语言——指针(一)

&#x1f4dd;前言 这篇文章主要带大家初步认识一下指针&#xff0c;供大家理解参考。 主要归纳与讲解&#xff1a; 1&#xff0c;指针与指针变量 2&#xff0c;指针的基本使用&#xff08;如何定义&#xff0c;初始化&#xff0c;引用&#xff09; &#x1f3ac;个人简介&…

计算方法 期末总结

思维导图 绪论 算法的性质&#xff1a; 有穷性、确切性、有输入输出、可行性 算法的描述方法&#xff1a; 自然语言、伪代码、流程图、N-S流程图 算法设计思想&#xff1a; 化大为小的缩减技术&#xff1a;二分法化难为易的校正技术&#xff1a;开方法化粗为精的松弛技术&a…

无需公网IP,使用内网穿透实现公网访问本地OpenWRT管理界面

文章目录 1.openWRT安装cpolar2.配置远程访问地址3.固定公网地址 简单几步实现在公网环境下远程访问openWRT web 管理界面&#xff0c;使用cpolar内网穿透创建安全隧道映射openWRT web 界面面板443端口&#xff0c;无需公网IP&#xff0c;无需设置路由器。 1.openWRT安装cpola…

SpringBoot使用ObjectMapper之Long和BigDemical类型的属性字符串处理,防止前端丢失数值精度

SpringBoot使用ObjectMapper之Long和BigDemical类型的属性字符串处理&#xff0c;防止前端丢失数值精度! 方式一&#xff1a;注解 使用注解 JsonFormat(shape JsonFormat.Shape.STRING)&#xff0c;如下&#xff1a; import com.fasterxml.jackson.annotation.JsonFormat; …

在arm 64 环境下使用halcon算法

背景&#xff1a; halcon&#xff0c;机器视觉领域神一样得存在&#xff0c;在windows上&#xff0c;应用得特别多&#xff0c; 但是arm环境下使用得很少。那如何在arm下使用halcon呢。按照官方说明&#xff0c;arm下只提供了运行时环境&#xff0c;并且需要使用价值一万多人民…

设计高手的秘密武器:5款让平面作品更出彩的软件

平面设计是一种迷人而多样化的艺术形式&#xff0c;它结合了颜色、形状、排版和创造力&#xff0c;通过图像和文本传达信息。市场上有各种各样的平面设计软件&#xff0c;选择合适的设计软件是成为优秀设计师的重要一步。为了降低软件成本&#xff0c;大多数设计师会优先使用免…

编译原理之LL(1)语法分析实验(附完整C/C++代码与测试)

一、实验内容与要求 先从键盘读入要分析的文法&#xff0c;由程序自动构造FIRST、FOLLOW 集以及SELECT集合&#xff0c;判断是否为LL (1)文法。 分析文法为G[E]&#xff1a; &#xff08;0&#xff09;E→ TE’ &#xff08;1&#xff09;E’→ TE’ &#xff08;2&#xff…

软件开发王者搭配:80%低代码+20%高代码

数字化领域从来不缺新概念&#xff0c;前两年市场大谈云原生、技术中台、业务中台等概念&#xff0c;企业更多聚焦在业务与IT架构的升级。而这两年&#xff0c;随着低代码、生成式AI的盛行&#xff0c;大家则开始挖掘数字化应用的低成本建设模式。 在过去&#xff0c;开发一套系…

Linux 是否被过誉了?

Linux 是否被过誉了&#xff1f; 有些人眼里&#xff0c;电脑这种东西就应该是华丽丽的桌面&#xff0c;手握鼠标戳戳按钮&#xff0c;键盘只为偶尔打打字&#xff0c;仿佛windows式的桌面形式才是理所应当&#xff0c;GUI才是理所应当&#xff0c;x86才是理所应当&#xff0c…

使用 NVProf 检测 CUDA kernel 的 bank conflict

使用 NVProf 检测 CUDA kernel 的 bank conflict NVProf 指令 使用 NVProf 可以对 bank conflict 进行检测: nvprof --events shared_ld_bank_conflict,shared_st_bank_conflict <app> [args...]其中: --events 选项指定的 shared_ld_bank_conflict,shared_st_bank_c…

python -opencv 中值滤波 ,均值滤波,高斯滤波实战

python -opencv 中值滤波 &#xff0c;均值滤波&#xff0c;高斯滤波实战 cv2.blur-均值滤波 cv2.medianBlur-中值滤波 cv2.GaussianBlur-高斯滤波 直接看代码吧&#xff0c;代码很简单&#xff1a; import copy import math import matplotlib.pyplot as plt import matp…

c++的更严格的类型转换要求

C有更严格的类型转换要求 C中对类型转换有严格的要求&#xff0c;需要的类型和给的类型不 一致时可能会编译报错 例如&#xff1a; C语言中 #include<stdio.h> #include<stdlib.h> //全局变量 //C语言中的函数的形参的类型可以不写&#xff0c;没有返回值可以返回&…

联发科正在改写全球高端手机芯片市场格局

全球高端手机芯片市场正在重塑。 11 月 21 日&#xff0c;联发科发布了新一代卓越 5G 生成式 AI 移动芯片天玑 8300。 这款定位于中端机档位的芯片&#xff0c;无论在技术架构还是在实际性能表现上&#xff0c;都实现了对前代旗舰芯片的赶超&#xff0c;彻底打破了业内长期存…

相机和滤镜应用程序Nevercenter CameraBag Photo mac软件特点说明

Nevercenter CameraBag Photo mac是一款相机和滤镜应用程序&#xff0c;它提供了一系列先进的滤镜、调整工具和预设&#xff0c;可以帮助用户快速地优化和编辑照片。 Nevercenter CameraBag Photo mac软件特点 1. 滤镜&#xff1a;Nevercenter CameraBag Photo提供了超过200种…

复费率电表和预付费电表有哪些区别?

随着科技的发展和能源管理的日益严格&#xff0c;电表技术也在不断更新换代。复费率电表和预付费电表作为两种主流的智能电表&#xff0c;各自具有独特的优势和应用场景。接下来&#xff0c;小编来为大家详细解析这两种电表的区别及其应用场景。 一、复费率电表 1.定义及工作原…