【图解算法】回溯法核心思想与 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/8/11 11:00:53 阅读更多 →
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/8/11 2:33:02 阅读更多 →
好的平台不让你“学会适应”,而是主动适应你的需求

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

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

2026/8/11 7:05:32 阅读更多 →

最新新闻

【STM32】01.GPIO开发

【STM32】01.GPIO开发

一、GPIO概述GPIO(General Purpose Input/Output,通用输入 / 输出口)是 STM32 等单片机最基础、最常用的外设之一,用于控制GPIO引脚,其引脚可配置为 8 种工作模式:输出类模式(4 种)&…

2026/8/13 23:18:47 阅读更多 →
遗留系统改造实战:从考古心态到微创手术的渐进式重构指南

遗留系统改造实战:从考古心态到微创手术的渐进式重构指南

上周,一个刚接手老项目的朋友深夜发来消息,语气里满是疲惫:“我快被这个‘地狱之地’搞疯了,代码像一团乱麻,改一个地方,十个地方报错,根本不敢动。” 他说的“地狱之地”,不是某个开…

2026/8/13 23:18:47 阅读更多 →
宽带套餐选择全攻略:揭秘渠道差异与避坑指南

宽带套餐选择全攻略:揭秘渠道差异与避坑指南

在实际宽带办理过程中,很多用户发现,在运营商官网或官方App上看到的套餐价格,与线下营业厅、电话营销渠道甚至某些合作推广渠道提供的方案存在差异。这种信息不对称,常常让用户感觉错过了更优惠的选择,甚至怀疑存在所谓…

2026/8/13 23:18:47 阅读更多 →
移动应用测试实战:从功能到安全,构建O2O应用质量护城河

移动应用测试实战:从功能到安全,构建O2O应用质量护城河

1. 项目概述:从“速享美食”看移动应用测试的实战全景最近在带团队做一个本地生活服务类的App项目,内部代号“速享美食”。这名字一听就知道,核心是围绕“快”和“美食”展开,用户能快速找到附近餐厅、点外卖、看评价、领优惠券。…

2026/8/13 23:18:47 阅读更多 →
IntelliJ IDEA创建SpringBoot项目的5种方法详解

IntelliJ IDEA创建SpringBoot项目的5种方法详解

1. 项目概述 作为一名Java全栈开发者,我使用IntelliJ IDEA创建SpringBoot项目的次数已经数不清了。在这个过程中,我发现很多新手开发者往往只知道一两种创建方式,但实际上IDEA提供了至少五种不同的SpringBoot项目创建方法,每种方法…

2026/8/13 23:18:47 阅读更多 →
PyQt5程序打包瘦身实战:从数百MB到几十MB的优化指南

PyQt5程序打包瘦身实战:从数百MB到几十MB的优化指南

1. 项目背景与痛点直击:为什么你的PyQt5程序“又胖又慢”?如果你用Python和PyQt5开发过桌面应用,并且满怀期待地用PyInstaller把它打包成一个独立的可执行文件(exe),那么你很可能经历过两个让人头疼的瞬间&…

2026/8/13 23:17:46 阅读更多 →

日新闻

Visual Studio新建项目解决方案为空:系统性排查与修复指南

Visual Studio新建项目解决方案为空:系统性排查与修复指南

1. 问题现象与本质剖析如果你是一位.NET开发者,或者正准备踏入这个领域,那么Visual Studio(后面简称VS)绝对是你绕不开的伙伴。但有时候,这个伙伴会跟你开一个不大不小的玩笑:你满怀期待地点击“创建新项目…

2026/8/13 0:00:09 阅读更多 →
长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

长春建设厅网站:普通人买房办事必看的真实指南与避坑攻略

说实话,每次提起“长春建设厅网站”这几个字,我心里都挺有感触的。不是因为它有多高大上,也不是因为那里藏着什么不可告人的秘密,恰恰相反,是因为它太“接地气”了,或者说,它是咱们普通人想要在这个城市好好生活、安稳买房时,必须得翻过的一座“数据山”。很多新朋友第…

2026/8/13 0:00:09 阅读更多 →
Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案

Windows家庭版远程桌面多用户破解完整指南:RDPWrap终极解决方案 【免费下载链接】rdpwrap.ini RDPWrap.ini for RDP Wrapper Library by StasM 项目地址: https://gitcode.com/GitHub_Trending/rd/rdpwrap.ini 你是否曾为Windows家庭版无法支持多用户远程桌面…

2026/8/13 0:00:09 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →