【图解算法】回溯法核心思想与 Java 实战(中低难度力扣题)
一、回溯法核心概念1.1 什么是回溯法回溯法Backtracking是一种基于深度优先搜索DFS的暴力搜索算法核心思想是在解决问题的过程中逐步构建解的路径当发现当前路径无法得到有效解时就 “回退” 到上一步重新选择其他路径继续探索。可以把回溯法理解为 “走迷宫”遇到死胡同就原路返回换一条路继续走直到找到出口或遍历完所有路径。1.2 回溯法的核心特征试探性每一步都尝试所有可能的选择不满足条件则回退剪枝在搜索过程中提前排除不可能的路径优化手段减少无效搜索递归实现回溯法通常用递归实现也可手动用栈实现递归的深度对应解的维度全局状态需要维护全局的 “路径” 和 “已选择” 状态回退时要恢复状态。1.3 回溯法解题框架万能模板回溯法的解题逻辑可以抽象为以下固定框架几乎所有回溯问题都能套用java运行// 全局变量存储最终结果 ListListInteger result new ArrayList(); // 全局变量存储当前路径 ListInteger path new ArrayList(); public void backtrack(选择列表, 路径, 已选状态) { // 1. 终止条件路径满足要求将路径加入结果集 if (终止条件) { result.add(new ArrayList(path)); // 注意要新建列表避免引用问题 return; } // 2. 遍历所有可选选项 for (选择 : 选择列表) { // 3. 剪枝排除无效选择可选优化性能 if (选择无效) { continue; } // 4. 做出选择将当前选择加入路径标记已选 path.add(选择); 标记已选状态; // 5. 递归探索下一层 backtrack(选择列表, 路径, 已选状态); // 6. 回溯撤销选择恢复状态 path.remove(path.size() - 1); 恢复已选状态; } }1.4 回溯法 vs 普通 DFS特性回溯法普通 DFS核心目标寻找所有可行解 / 最优解遍历所有节点 / 判断可达性状态处理需维护并恢复路径状态仅标记访问状态剪枝核心优化手段可选非必须应用场景组合、排列、子集、分割等图遍历、连通性判断等二、力扣中低难度回溯实战题题目 1子集LeetCode 78中等题目描述给你一个整数数组nums数组中的元素互不相同。返回该数组所有可能的子集幂集。解集不能包含重复的子集。你可以按任意顺序返回解集。解题思路回溯核心子集问题是 “选或不选” 的问题每个元素有两种选择加入当前子集 或 不加入回溯框架应用终止条件遍历完所有元素时将当前路径子集加入结果选择列表当前位置之后的所有元素剪枝无需剪枝所有子集都有效选择 / 回溯加入当前元素 → 递归 → 移除当前元素。完整代码java运行import java.util.ArrayList; import java.util.List; class Solution { // 存储最终所有子集 private ListListInteger result new ArrayList(); // 存储当前子集路径 private ListInteger path new ArrayList(); public ListListInteger subsets(int[] nums) { if (nums null) { return result; } // 从索引0开始回溯 backtrack(nums, 0); return result; } private void backtrack(int[] nums, int start) { // 终止条件每一步的路径都是一个有效子集直接加入结果无需等遍历完所有元素 result.add(new ArrayList(path)); // 遍历当前可选的元素从start开始避免重复子集 for (int i start; i nums.length; i) { // 做出选择将nums[i]加入当前子集 path.add(nums[i]); // 递归探索下一层从i1开始避免重复选择同一元素 backtrack(nums, i 1); // 回溯撤销选择移除nums[i] path.remove(path.size() - 1); } } }代码说明终止条件特殊子集问题中每一步的路径都是一个有效子集因此进入递归就先将路径加入结果无需等遍历完所有元素start参数的作用限制选择列表的起始位置避免生成重复子集如 [1,2] 和 [2,1] 视为同一子集时间复杂度O (n×2ⁿ)n 为数组长度每个元素有选 / 不选两种可能共 2ⁿ个子集每个子集复制需要 O (n) 时间空间复杂度O (n)递归深度最多为 n路径列表的长度最多为 n。测试用例输入输出部分解释[1,2,3][], [1], [2], [3], [1,2]所有子集共 8 个包含空集题目 2组合LeetCode 77中等题目描述给定两个整数n和k返回范围[1, n]中所有可能的k个数的组合。你可以按任何顺序返回答案。解题思路回溯核心从 1~n 中选择 k 个数不考虑顺序需限制路径长度为 k回溯框架应用终止条件路径长度等于 k 时将路径加入结果选择列表当前位置之后的所有数剪枝若剩余可选数不足 k - path.size ()直接跳过优化选择 / 回溯加入当前数 → 递归 → 移除当前数。完整代码java运行import java.util.ArrayList; import java.util.List; class Solution { private ListListInteger result new ArrayList(); private ListInteger path new ArrayList(); public ListListInteger combine(int n, int k) { backtrack(n, k, 1); return result; } private void backtrack(int n, int k, int start) { // 终止条件路径长度等于k找到有效组合 if (path.size() k) { result.add(new ArrayList(path)); return; } // 遍历可选数剪枝剩余数 n - i 1需要满足 剩余数 k - path.size() // 即 i n - (k - path.size()) 1 for (int i start; i n - (k - path.size()) 1; i) { // 做出选择 path.add(i); // 递归下一个数从i1开始 backtrack(n, k, i 1); // 回溯 path.remove(path.size() - 1); } } }代码说明剪枝优化i n - (k - path.size()) 1是核心优化例如 n5、k3当 path.size ()1 时剩余需要选 2 个数因此 i 最大只能到 45-21若 i5 则无法选够 2 个数直接跳过终止条件只有路径长度等于 k 时才是有效组合加入结果时间复杂度O (C (n,k)×k)C (n,k) 是组合数每个组合复制需要 O (k) 时间空间复杂度O (k)递归深度最多为 k。测试用例输入输出解释n4,k2[[1,2],[1,3],[1,4],[2,3],[2,4],[3,4]]1

相关新闻

用 Cursor + PM Skills,把「想法」一次做到「可点原型」

用 Cursor + PM Skills,把「想法」一次做到「可点原型」

用 Cursor PM Skills,把「想法」一次做到「可点原型」 面向产品经理与业务同学:不写框架代码,也能从脑暴、PRD 走到可演示的后台页面。 一、安装环境依赖 开工前装好 Node.js(推荐 v24.15.0) 和 Git(推荐 …

2026/10/1 8:38:20 阅读更多 →
CICD巡检命令

CICD巡检命令

CentOS cat /etc/os-release uname -i //内核版本 uptime //开机时间、CPU平均负荷、在线用户 timedatectl /时区、同步状态 who / w //当前登录用户 hostname //主机名 hostname -i //内网IP ss -s //tcp连接统计 free -h lsblk -l df -h iostat -xz 1 5 //IO详情统计…

2026/9/25 12:31:19 阅读更多 →
好的平台不让你“学会适应”,而是主动适应你的需求

好的平台不让你“学会适应”,而是主动适应你的需求

有些平台的设计逻辑是:你来了,就要适应它的规则。适应它的界面、适应它的流程、适应它的售后方式、适应它的发票格式。你要花时间去“学会怎么用”。而好的平台逻辑正好相反:它不需要你主动去适应它,而是它在你还没意识到需要什么…

2026/10/4 13:45:30 阅读更多 →

最新新闻

基于单片机的电阻炉温控系统:DS18B20与PID调参实战

基于单片机的电阻炉温控系统:DS18B20与PID调参实战

简介:基于单片机的电阻炉温控制系统设计,是一套面向电子、自动化专业学生及嵌入式初学者的完整课程设计/毕设方案,涵盖DS18B20数字测温、单片机温度曲线动态跟踪和上位机通信三大环节。方案从硬件原理图、下位机控制程序到VB上位机界面均有实…

2026/10/15 15:21:06 阅读更多 →
北京密云区油烟机维修|油烟机维修|不启动不开机就近上门检修|欧米到家客服电话

北京密云区油烟机维修|油烟机维修|不启动不开机就近上门检修|欧米到家客服电话

快速导航:本文系统梳理北京地区油烟机九大高发故障的成因、表现与自查方法,帮助您快速判断问题、避开维修陷阱、选择正规靠谱的上门服务。 24小时服务热线:400-996-9791 | 官网:www.oumidj.com 🗺️ 一、欧米到家北…

2026/10/15 15:21:06 阅读更多 →
CTF竞赛高效工具链:逆向/PWN/Web三类题型最小可用组合

CTF竞赛高效工具链:逆向/PWN/Web三类题型最小可用组合

简介:本资源是面向CTF网络安全竞赛选手与初学者的综合性工具软件合集,覆盖隐写分析、Web渗透(含蚁剑、御剑等主流工具)、二进制逆向、杂项解题(Misc)、数据库操作及辅助开发等核心赛题场景,有效…

2026/10/15 15:21:06 阅读更多 →
python的机器人基础原理工业场景模拟第三十二篇:码垛工位,给笛卡尔起点终点,生成直线路径,逐点调用逆运动学换算关节角度。

python的机器人基础原理工业场景模拟第三十二篇:码垛工位,给笛卡尔起点终点,生成直线路径,逐点调用逆运动学换算关节角度。

《Python机器人基础原理》第三十二篇:码垛工位——给笛卡尔起点终点生成直线路径,逐点调用逆运动学换算关节角度1. 实际工业应用场景周三下午,某电商物流分拣中心。一条传送带将码放整齐的纸箱送到抓取工位,一台4-DOF码垛机器人需…

2026/10/15 15:21:06 阅读更多 →
从客服机制看金融平台可信度:常态化服务与用户信任的系统设计

从客服机制看金融平台可信度:常态化服务与用户信任的系统设计

开头 “XX 平台靠谱吗”几乎是消费金融领域最容易被问到、也最难回答的问题。难在哪里?因为“靠谱”不是一个可以量化的单一指标,它包含了资质合规、资金安全、利率透明、隐私保护、催收规范、客服响应等一系列维度。普通用户往往只能看到广告和 App 首页…

2026/10/15 15:21:06 阅读更多 →
Python数据分析实战:从工具链到工程化实践

Python数据分析实战:从工具链到工程化实践

1. 项目概述:为什么Python是数据分析师的首选工具十年前我刚入行数据分析时,主流工具还是Excel和SPSS。直到2015年第一次用Python处理百万行销售数据,5分钟完成同事需要通宵操作的报表,才真正体会到"工欲善其事必先利其器&qu…

2026/10/15 15:20:03 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →