news 2026/8/10 4:27:34

数据结构之回溯算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构之回溯算法

一、回溯算法简介

回溯算法(Backtracking)是一种基于递归的穷举搜索算法,核心思想是 “尝试 - 回退 - 再尝试”:从初始状态出发,逐步探索所有可能的路径,当发现当前路径无法满足条件时(剪枝),撤销当前选择(回溯),回到上一步继续探索其他路径,直到找到解或遍历完所有可能。

回溯算法天然适配 “组合、排列、子集、切割、棋盘(如 N 皇后)” 等多选择、多约束的问题,是数据结构与算法中解决 “穷举类” 问题的核心方法。

二、核心要素

回溯算法的执行过程可类比 “走迷宫”:走一步→发现不通→退回来→换方向再走。其核心包含 4 个要素:

要素说明
路径已做出的选择(如已选的组合、排列元素,已放置皇后的位置)
选择列表当前步骤可选择的选项(如剩余未选的元素、皇后可放置的列)
结束条件到达决策树的叶子节点,路径满足要求(如组合长度达标、排列完成)
剪枝提前排除无效路径(如重复组合、皇后冲突),减少不必要的穷举(优化核心)

三、应用场景

以下通过 4 类经典问题,讲解回溯算法的具体实现,覆盖 “组合、排列、子集、棋盘” 四大核心场景。

场景 1:组合问题(无重复元素,不考虑顺序)

问题:给定数组nums = [1,2,3],找出所有长度为 2 的组合(如[1,2][1,3][2,3])。核心:组合不考虑顺序,需通过 “起始索引” 避免重复(如选 1 后只选 1 之后的元素)。

场景 2:排列问题(无重复元素,考虑顺序)

问题:给定数组nums = [1,2,3],找出所有全排列(如[1,2,3][1,3,2][2,1,3]等)。核心:排列考虑顺序,需通过 “已选集合” 避免重复选择同一元素。

场景 3:子集问题(所有可能的子集,包括空集)

问题:给定数组nums = [1,2,3],找出所有子集(如[][1][1,2][1,2,3][2]等)。核心:子集是 “选或不选” 的结果,结束条件可省略(每次递归都将当前路径加入结果)。

场景 4:棋盘问题(N 皇后,带复杂约束)

问题:N 皇后问题:在 N×N 的棋盘上放置 N 个皇后,使得任意两个皇后不在同一行、同一列、同一斜线,找出所有合法的放置方案。核心:通过剪枝快速排除无效位置(同行 / 同列 / 同斜线),减少穷举次数。

四、案例分享

题目:给定一个整型数组,其中所有元素都各不相同,返回这些元素所有可能的排列。

如[1,2,3],返回:[[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]。

import java.util.LinkedList; import java.util.List; public class Solution { List<List<Integer>> result = null; List<Boolean> used = null; // p中保存了一个有index个元素的排列,向这个排列末尾添加第index+1个元素 // 获得一个有index+1个元素的排列 void generatePermutation(int[] nums, int index, List<Integer> p) { if (index == nums.length) { result.add(new LinkedList<>(p)); return; } for (int i = 0; i < nums.length; ++i) if (!used.get(i)) { // 将nums[i]添加到p中 p.add(nums[i]); used.set(i, true); // 递归 generatePermutation(nums, index + 1, p); // 下面两行实现回溯,因为以后还会使用到nums[i],是逐个元素进行回溯 p.remove(p.size() - 1); used.set(i, false); } return; } // 46 使用递归和回溯的算法完成该题 public List<List<Integer>> permute(int[] nums) { result = new LinkedList<List<Integer>>(); if (nums.length == 0) return result; LinkedList<Integer> p = new LinkedList<>(); used = new LinkedList<>(); // 初始化used for (int i = 0; i < nums.length; ++i) used.add(i, false); generatePermutation(nums, 0, p); return result; } public static void main(String[] args) { int[] nums = { 1, 2, 3 }; System.out.println(new Solution().permute(nums)); } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 12:38:23

【EF Core】“Code First”方案下以编程方式生成迁移

&#xff08;Migrations&#xff09;是个啥玩意&#xff1f;IT 界从来不缺造词人才&#xff0c;总喜欢造各种各样的词。之所以叫迁移&#xff0c;大概是因为使用它可以创建并在后期修订数据库。总之&#xff0c;说人话就是迁移可以生成一系列的 .NET 类&#xff0c;每个类代表一…

作者头像 李华
网站建设 2026/8/9 23:27:02

【完整源码+数据集+部署教程】个人安全防护装备检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着社会经济的快速发展和工业化进程的加快&#xff0c;个人安全防护装备&#xff08;PPE&#xff09;的使用变得愈发重要。尤其是在建筑、制造、化工等高风险行业&#xff0c;PPE的佩戴不仅关乎工人的个人安全&#xff0c;也直接影响到企业的生产效率和安全管理水…

作者头像 李华
网站建设 2026/8/9 15:55:55

恒压恒流同步降压转换器 5.1V固定输出/可调输出YB2416E 30V/3A

YB2416 是一款输入耐压超过 40V&#xff0c;在 4.5V~30V 输入电压条件下正常工作&#xff0c;并且能够实现精确恒压以 及恒流的同步降压型 DC-DC 转换器。YB2416 内部集成 80mΩ的上管和 40mΩ的下管&#xff0c; 无需外部肖特基二极管&#xff0c;可连续输出 3A 电流。输出 3A…

作者头像 李华
网站建设 2026/8/9 10:48:17

如何利用JSP实现大文件上传的进度监控?

陕西Java程序员外包项目解决方案&#xff1a;原生JS大文件传输系统&#xff08;兼容IE9&#xff09; 兄弟&#xff0c;作为陕西的个人Java程序员&#xff0c;我太懂你现在的处境了——甲方要大文件上传&#xff0c;还要兼容IE9&#xff0c;预算卡得死死的&#xff0c;自己头发…

作者头像 李华
网站建设 2026/8/10 4:23:26

一文全知道,PCB制造相关的国际、国家和行业标准有哪些?

与PCB制造相关的标准&#xff0c;一般常用的标准体系大致可分为&#xff1a;国际通用标准&#xff08;IPC、IEC、ISO、UL 等&#xff09;、中国国家/行业标准&#xff0c;以及特定行业&#xff08;汽车、航空航天、医疗等&#xff09;的专用标准或体系要求。下面小班按体系分类…

作者头像 李华
网站建设 2026/8/9 11:33:31

wangEditor粘贴MathType公式转图片格式处理

从迷茫到突破&#xff1a;我在集团信创Word导入系统项目中的成长记 一、初遇难题&#xff1a;在技术迷宫中迷失方向&#xff08;2024年3月&#xff09; "小张&#xff0c;这个政府采购项目的标书必须在今天下班前完成格式调整&#xff01;"主管的催促声还在耳边回响…

作者头像 李华