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

回溯算法解决排列组合及子集问题

216. 组合总和 III
39. 组合总和
40. 组合总和 II
46. 全排列
47. 全排列 II
77. 组合

78. 子集

90. 子集 II

以上是力扣设计相关问题的题目。排列组合还是子集问题无非就是从序列 nums 中以给定规则取若干元素,主要有以下几类:

  1. 元素无重不可复选,即 nums 中的元素都是唯一的,每个元素最多只能被使用一次,这也是最基本的形式。
  2. 元素可重不可复选,即 nums 中的元素可以存在重复,每个元素最多只能被使用一次。
  3. 元素无重可复选,即 nums 中的元素都是唯一的,每个元素可以被使用若干次。

以组合为例:

1.如果输入 nums = [2,3,6,7],和为 7 的组合应该只有 [7]

2.如果输入 nums = [2,5,2,1,2],和为 7 的组合应该有两种 [2,2,2,1] 和 [5,2]

3.如果输入 nums = [2,3,6,7],和为 7 的组合应该有两种 [2,2,3] 和 [7]

上面用组合问题举的例子,但排列、组合、子集问题都可以有这三种基本形式,所以共有 9 种变化。

除此之外,题目也可以再添加各种限制条件,比如让你求和为 target 且元素个数为 k 的组合,那这么一来又可以衍生出一堆变体,所以一般笔试很喜欢出这种题。

但无论怎么变化,其本质就是穷举所有解,而这些解呈现树形结构,使用回溯算法框架再稍微修改一些细节即可把这些问题一网打尽

回溯算法框架代码如下:

import java.util.ArrayList;
import java.util.List;public class BacktrackExample {private List<List<Object>> result = new ArrayList<>();public void backtrack(List<Object> path, List<Object> choices) {if (满足结束条件(path)) {result.add(new ArrayList<>(path));return;}for (Object choice : choices) {// 做选择path.add(choice);// 递归backtrack(path, choices);// 撤销选择path.remove(path.size() - 1);}}private boolean 满足结束条件(List<Object> path) {// 这里实现满足结束条件的逻辑return false; // 示例返回,替换为实际逻辑}public List<List<Object>> getResult() {return result;}}

问题一:当元素无重不可复选时,即 nums 中的元素都是唯一的,每个元素最多只能被使用一次:

// 组合/子集问题回溯算法框架
void backtrack(int[] nums, int start) {// 回溯算法标准框架for (int i = start; i < nums.length; i++) {// 做选择track.addLast(nums[i]);// 注意参数backtrack(nums, i + 1);// 撤销选择track.removeLast();}
}// 排列问题回溯算法框架
void backtrack(int[] nums) {for (int i = 0; i < nums.length; i++) {// 剪枝逻辑if (used[i]) {continue;}// 做选择used[i] = true;track.addLast(nums[i]);backtrack(nums);// 撤销选择track.removeLast();used[i] = false;}
}

 问题二:元素可重不可复选,即 nums 中的元素可以存在重复,每个元素最多只能被使用一次,其关键在于排序和剪枝

Arrays.sort(nums);
// 组合/子集问题回溯算法框架
void backtrack(int[] nums, int start) {// 回溯算法标准框架for (int i = start; i < nums.length; i++) {// 剪枝逻辑,跳过值相同的相邻树枝if (i > start && nums[i] == nums[i - 1]) {continue;}// 做选择track.addLast(nums[i]);// 注意参数backtrack(nums, i + 1);// 撤销选择track.removeLast();}
}Arrays.sort(nums);
// 排列问题回溯算法框架
void backtrack(int[] nums) {for (int i = 0; i < nums.length; i++) {// 剪枝逻辑if (used[i]) {continue;}// 剪枝逻辑,固定相同的元素在排列中的相对位置if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {continue;}// 做选择used[i] = true;track.addLast(nums[i]);backtrack(nums);// 撤销选择track.removeLast();used[i] = false;}
}

问题三:元素无重可复选,即 nums 中的元素都是唯一的,每个元素可以被使用若干次,只要删掉去重逻辑即可:

// 组合/子集问题回溯算法框架
void backtrack(int[] nums, int start) {// 回溯算法标准框架for (int i = start; i < nums.length; i++) {// 做选择track.addLast(nums[i]);// 注意参数backtrack(nums, i);// 撤销选择track.removeLast();}
}// 排列问题回溯算法框架
void backtrack(int[] nums) {for (int i = 0; i < nums.length; i++) {// 做选择track.addLast(nums[i]);backtrack(nums);// 撤销选择track.removeLast();}
}

只要从树的角度思考,这些问题看似复杂多变,实则改改 base case 就能解决。只要熟悉了该框架,再细致了解一下细节问题,相信排列组合子集问题都不是问题。

相关文章:

回溯算法解决排列组合及子集问题

216. 组合总和 III39. 组合总和40. 组合总和 II46. 全排列47. 全排列 II77. 组合 78. 子集 90. 子集 II 以上是力扣设计相关问题的题目。排列组合还是子集问题无非就是从序列 nums 中以给定规则取若干元素&#xff0c;主要有以下几类&#xff1a; 元素无重不可复选&#xff0…...

Unity中Mesh多种网格绘制模式使用方法参考

Unity中MeshFilter中的Mesh默认情况下使用MeshTopology.Trigangles类型绘制网格&#xff0c;就是通常的绘制三角形网格&#xff0c;实际上Mesh有五种绘制模式&#xff0c;对应MeshTopology的枚举&#xff0c;分别是 Triangles网格由三角形构成。Quads网格由四边形构成。Lines网…...

【Spring Security】基于SpringBoot3.3.4版本②如何配置免鉴权Path

基于Spring Boot 3.3.4,详细说明Spring Security 6.3.3的使用 摘要本地开发环境说明SecurityFilterChain介绍application.ymlWen3SecurityProperties.java修改DemoWen3Security修改SecurityFilterChainIgnoredPathController.javaIgnoredPathController2.java启动工程测试测试…...

信息学奥赛复赛复习11-CSP-J2020-04方格取数-动态规划、斐波那契数列、最优子结构、重叠子问题、无后效性

PDF文档回复:20241004 1 P7074 [CSP-J2020] 方格取数 [题目描述] 设有 nm 的方格图&#xff0c;每个方格中都有一个整数。现有一只小熊&#xff0c;想从图的左上角走到右下角&#xff0c;每一步只能向上、向下或向右走一格&#xff0c;并且不能重复经过已经走过的方格&#x…...

Hive数仓操作(十二)

一、Hive 中的行列转换 1. 行转列&#xff1a; collect_list() collect_list() 函数用于将一个列中的数据收集成一个数组。 示例数据文件 假设有一个名为 orders.txt 的文件&#xff0c;内容如下&#xff1a; 1,101 1,101 1,103 2,104 2,105导入数据到 Hive 表 首先&…...

计算机毕业设计 基于SpringBoot和Vue的课程教学平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…...

有状态(Session) VS 无状态(Token)

目录 概念 JWT Token在项目中使用 概念 有状态和无状态服务是两种不同的服务架构&#xff0c;两者的不同之处在于对于服务状态的处理。 1、有状态服务 是指程序在执行过程中生成的中间数据&#xff0c;服务器端一般都要保存请求的相关信息&#xff0c;每个请求可以默认地使…...

天坑!Spark+Hive+Paimon+Dolphinscheduler

背景: 数据中台项目使用Spark+Hive+Paimon做湖仓底层,调度任务使用的是基于Dolphinscheduler进行二开。在做离线脚本任务开发时,在Paimon库下执行非查询类SQL报错。 INSERT报错 DELETE报错 现状: 原始逻辑为数据中台中选择的Paimon数据源,实际上在Dolphinscheduler中是…...

JAVA——IO框架

目录 一、框架 二、导入框架步骤 三、测试 一、框架 框架就是为了解决某类问题&#xff0c;编写的一套类、接口等。大多数框架都是第三方研发的 好处: 在框架的基础上开发&#xff0c;提高开发效率 框架的形式&#xff1a;一般是把类、接口编译成class形式&#xff0c;再…...

项目管理系统如何实现项目申报流程自动化?

传统的项目申报流程往往繁琐复杂&#xff0c;涉及众多环节和部门间的协作&#xff0c;不仅耗时费力&#xff0c;还容易因人为疏忽而导致错误或延误。随着信息技术的飞速发展&#xff0c;项目管理系统的出现为项目申报流程的自动化提供了可能&#xff0c;极大地提升了申报效率和…...

ndb9300public-ndb2excel简介

1 引言 ndb9300是一个自己定义的机载导航数据库劳作&#xff08;不敢称为项目&#xff09;代号&#xff0c;其中3表示是第3种数据库。 多年前&#xff0c;对在役民航客机中的某型机载导航数据库的二进制文件进行分析&#xff0c;弄明白它的数据结构后做了几个工具&#xff0c…...

C++:const成员

const修饰成员变量&#xff0c;要在初始化列表中进行初始化。 const修饰成员函数&#xff0c;要放在函数后&#xff0c;称为常函数。常函数不能修改普通成员变量。 const修饰的对象&#xff0c;称为常对象。常对象不能修改普通成员变量&#xff0c;只能读取。 常对象只能使用…...

基于ROS的激光雷达点云物体检测

环境 RTX 2060&#xff08;后面关于算力&#xff09; ubuntu 18.04 ROS melodic &#xff08;ubuntu 18.04安装ROS melodic可以参看我这篇文章ubuntu 18.04安装ROS系统&#xff09; CUDA 10.0 cudnn 7.6.5 caffe cmake 3.18.0&#xff08;不能低于3.12.2&#xff09; opencv 3…...

大模型训练环境搭建

硬件资源说明 本教程基于GPU 3090的服务器 资源类型 型号 核心指标 CPU Intel(R) Xeon(R) Bronze 3204 CPU 1.90GHz 12核 内存 / 125Gi GPU NVIDIA GeForce RTX 3090 24G显存 注意&#xff1a;接下来的部分命令需要使用科学上网&#xff0c;需要事先配置好。 安…...

使用Java调用GeoTools实现全球国家矢量数据入库实战

目录 前言 一、相关数据介绍 1、无空间参考的数据 2、有空间参考的数据 3、空间信息表物理模型 二、全球国家空间数据入库 1、后台实体类图 2、后台实体对象关键代码 三、时空数据入库实践 1、读取无空间参考数据 2、入库成果及注意事项 四、总结 前言 在当今世界&…...

计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python+Django+Vue Python爬虫 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…...

Springboo通过http请求下载文件到服务器

这个方法将直接处理从URL下载数据并将其保存到文件的整个过程。下面是一个这样的方法示例&#xff1a; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection…...

使用CSS实现酷炫加载

使用CSS实现酷炫加载 效果展示 整体页面布局 <div class"container"></div>使用JavaScript添加loading加载动画的元素 document.addEventListener("DOMContentLoaded", () > {let container document.querySelector(".container&q…...

【STM32-HAL库】AHT10温湿度传感器使用(STM32F407ZGT6配置i2c)(附带工程下载连接)

一、温湿度传感器&#xff1a; 温湿度传感器是一种能够检测环境中的温度和湿度&#xff0c;并将其转化为电信号输出的装置。它在智能家居、工业自动化、气象监测、农业等领域有着广泛的应用。 原理&#xff1a; 温湿度传感器通常基于不同的物理原理&#xff0c;以下是一些常见…...

深入理解网络通信: 长连接、短连接与WebSocket

在现代网络应用开发中,选择合适的通信方式对于应用的性能、效率和用户体验至关重要。本文将深入探讨三种常见的网络通信方式:长连接、短连接和WebSocket,分析它们的特点、区别以及适用场景。 1. 短连接 © ivwdcwso (ID: u012172506) 1.1 定义 短连接是指客户端和服务器…...

实测联想小新Pro 16 GT:一台把性能、AI和续航拉满的AI PC

最近体验了联想小新Pro 16 GT AI元启版&#xff0c;它不像是传统轻薄本&#xff0c;更像一台兼顾便携、性能和智能体验的全能机型。抛开品牌滤镜&#xff0c;单看硬件和实际使用&#xff0c;确实有不少值得一说的亮点。外观轻薄耐看&#xff0c;屏幕和接口都很实在这台机器用了…...

DanKoe 视频笔记:致富之路:三个关键决策

在本节课中&#xff0c;我们将要学习决定个人能否实现财富积累的三个核心决策。这些决策并非关于具体的赚钱技巧&#xff0c;而是关于如何从根本上重塑你的思维方式和行为模式&#xff0c;为创造财富铺平道路。 概述 许多人渴望财富&#xff0c;但往往不得其法。真正的致富之…...

cool-admin(midway版)前端图标系统:高级实践

cool-admin(midway版)前端图标系统&#xff1a;高级实践 【免费下载链接】cool-admin-midway &#x1f525; cool-admin(midway版)一个很酷的后台权限管理框架&#xff0c;模块化、插件化、CRUD极速开发&#xff0c;永久开源免费&#xff0c;基于midway.js 3.x、typescript、ty…...

经典算法实现:二分查找、全排列与子集生成

在算法学习中&#xff0c;二分查找、全排列、子集生成是非常基础且重要的内容。本文将结合 C 代码&#xff0c;详细讲解这三种经典算法的实现思路与核心逻辑&#xff0c;帮助大家理解算法的底层原理和代码落地方式。一、二分查找&#xff08;Binary Search&#xff09;二分查找…...

OpenClaw+SecGPT-14B联动方案:3类网络安全自动化场景实测

OpenClawSecGPT-14B联动方案&#xff1a;3类网络安全自动化场景实测 1. 为什么选择这个技术组合&#xff1f; 去年我在做安全研究时&#xff0c;经常需要重复处理三类任务&#xff1a;分析漏洞报告、检查日志异常、收集威胁情报。这些工作既需要专业判断&#xff0c;又包含大…...

2026顶空气体分析仪TOP5|权威评测与选购指南

顶空气体分析仪&#xff0c;又叫顶空残氧仪&#xff0c;主要用于测量封闭容器中顶部空间氧气与二氧化碳的浓度。随着市场需求越来越大&#xff0c;市面上品牌五花八门&#xff0c;新手选购易踩雷、难抉择。本次榜单严格遵循客观数据真实口碑原则&#xff0c;综合公司背景、技术…...

JAVA重点基础、进阶知识及易错点总结(17)线程安全 synchronized 同步锁

&#x1f680; Java 巩固进阶 第17天 主题&#xff1a;线程安全 & synchronized 同步锁 —— 并发编程的第一道防线&#x1f4c5; 进度概览&#xff1a;今天攻克 多线程最核心难题&#xff1a;线程安全。这是面试必考、生产环境必用的知识点&#xff0c;直接决定你的代码能…...

论文AIGC全红99%怎么救?2026实测Gemini去痕术:3组指令集联合3大工具,稳稳拉回10%安全线

视角重构&#xff0c;打破“平铺直叙”的机械感 AI生成的最大特征是“正确但平庸的上帝视角”。要ai降ai&#xff0c;第一步不是改词&#xff0c;而是强行植入一个具有批判性的“人类观察者”视角&#xff0c;迫使模型重组叙事逻辑。 核心原理&#xff1a;通过引入“辩证法”…...

Qwen3.5-9B生产环境实测:7x24小时稳定运行+自动恢复+错误率<0.3%运维报告

Qwen3.5-9B生产环境实测&#xff1a;7x24小时稳定运行自动恢复错误率<0.3%运维报告 1. 项目概述 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型&#xff0c;在实际生产环境中展现出卓越的稳定性和可靠性。经过长达一个月的7x24小时不间断运行测试&#xff0c;该系统实现了…...

STM32与LoRa实现高压线缆智能监控方案

1. 项目概述高压线缆间隔棒监控装置是一个典型的工业物联网应用案例&#xff0c;它完美展现了如何将嵌入式系统与无线通信技术结合解决传统行业的痛点问题。作为一名在电力监控领域工作多年的工程师&#xff0c;我深知人工巡检高压线路的种种不便——不仅效率低下&#xff0c;而…...