- 博客(146)
- 收藏
- 关注
原创 MCP 与 Skills:让 AI 从“会聊天”变成“会干活”
MCP 与 Skills:AI 能力扩展的两大支柱 🏗️ 摘要: 本文深入解析了扩展AI能力的两种核心机制:MCP(模型上下文协议)和Skills(技能)。MCP如同AI的"数据线",负责连接外部服务(数据库、API等),解决"能不能访问"的问题;Skills则是"操作手册",固化工作流程(代码审查、日报生成等),解决"应该怎么做"的问题。两者常通过插件形式打包分发,形成完整的能力扩展方案。MCP赋予AI外部访问权限,Skills沉淀可复用的经验流程,二者的组合使用能显著提升AI在真实工作场景中的实用性。
2026-06-30 11:37:50
174
原创 Vibe Coding 实战复盘:一个人 + AI,从零打造会聊天的个人主页
这篇文章记录了作者从零开始打造一个带AI聊天功能的个人主页的完整实践过程。以下是摘要: 项目背景 作者为了实践AI Agent和Vibe Coding的学习成果,决定开发一个智能个人主页,包含基本信息展示和可对话的"数字分身"功能。 技术选型 采用Astro(静态生成+局部交互)、TypeScript(类型安全)、Tailwind CSS(快速样式开发)和MDX(内容管理)的组合,平衡了开发效率和项目需求。 架构设计 页面内容与浮动交互层分离 组件化设计(头像区、信息卡片、时间线等) 聊天窗口和作品展示采用
2026-06-29 18:37:46
330
原创 hello-agents学习笔记--构建自己的Agent框架
本文介绍了构建轻量级Agent框架HelloAgents的设计思路和核心实现。该框架旨在通过统一的LLM调用接口、消息格式、Agent基类和工具系统,为不同Agent范式提供技术底座,避免重复造轮子。关键实现包括: 统一消息系统:标准化的Message类定义消息格式,兼容OpenAI API并支持扩展元数据; 集中配置管理:Config类统一管理模型参数、日志级别等运行时配置; 抽象Agent基类:规定所有Agent必须实现run()方法,并内置历史对话管理功能; LLM接口解耦:HelloAgentsLL
2026-06-28 22:00:38
329
原创 hello-agents学习笔记--LangGraph框架
LangGraph作为LangChain生态中的智能体工作流框架,其核心特点是通过图结构(状态、节点、边)实现可控的流程化任务处理。与传统链式调用不同,它能灵活处理分支、循环和回退逻辑,适用于问答助手、代码生成测试等需要明确流程的场景。 优势: 流程可控:通过预定义节点和边确保任务按预期执行,避免智能体自由对话导致的不可控性。 模块化:每个节点独立,便于测试和复用。 循环支持:适合“生成-检查-修正”类任务(如代码调试、论文修改)。 高可靠性:适用于金融风控等需严格流程的领域。 局限性: 灵活性较低:需预先
2026-06-26 17:09:50
683
原创 hello-agents学习笔记--CAMEL框架
CAMEL是一个基于角色扮演的多智能体协作框架,其核心思想是通过精心设计的角色提示词,让多个智能体围绕任务自主协作。与AutoGen等框架不同,CAMEL更强调角色对话的自然性,而非复杂流程编排。 关键特点: 采用Role-Playing机制,让不同角色智能体(如研究员+程序员)通过对话分工协作 使用Inception Prompting技术明确角色、任务和协作方式 实现简单,主要控制任务、角色和对话轮数即可 优势:简单直观,适合快速构建双角色协作原型,如需求分析、代码生成等场景。局限性在于对提示词依赖强,
2026-06-26 16:54:03
167
原创 hello-agents学习笔记--AgentScope框架
摘要: AgentScope 是一个工程化的多智能体协作平台,采用消息驱动架构设计,强调分布式、可扩展和稳定性。其核心特点包括标准化消息传递(Msg 对象)、智能体解耦、异步通信支持,以及工程化组件如消息中心(MsgHub)和管道(Pipeline)。通过“三国狼人杀”案例,展示了其处理复杂角色协作、并发交互和结构化输出的能力(如狼人私聊频道的动态建立)。优势在于适合大规模、高稳定性需求的应用,但学习成本较高,更适合生产级复杂系统而非轻量级原型开发。
2026-06-26 16:17:52
314
原创 hello-agents学习笔记--AutoGen框架
AutoGen 是一个面向多智能体协作的开发框架。它的核心不是让一个大模型单独完成所有事情,而是把任务拆给多个具有不同职责的智能体,让它们通过对话协作完成任务。在软件开发场景中,可以把不同智能体看作一个虚拟开发团队:产品经理负责分析需求,工程师负责写代码,代码审查员负责检查质量,用户代理负责反馈或验收。整个任务的推进过程,本质上就是这些角色之间的一轮轮消息传递。
2026-06-26 15:19:20
477
原创 微型商城(Mini Mall)—— 完整演示(二)
《微型商城(Mini Mall)开发摘要》 本文详细介绍了电商系统核心模块的开发流程: 商品模块: 实现商品列表(支持搜索、分类筛选和分页) 开发商品详情页 采用Server Component数据获取和TailwindCSS样式 通过/review指令进行代码质量审查 用户认证模块: 基于Cookie+Session实现注册登录系统 使用bcryptjs哈希存储密码 通过/security-review指令进行安全检查 演示多模型切换(Opus/Sonnet/Haiku)的应用场景 购物车模块: 实现完整
2026-06-22 22:22:16
388
原创 微型商城(Mini Mall)—— 完整演示(一)
文章摘要 《微型商城(Mini Mall)——完整演示Claude Code 13项核心功能》是一个全栈电商项目教程,通过构建可部署的Web应用,系统展示Claude Code的核心功能应用。项目采用Next.js 16+TypeScript+SQLite技术栈,包含买家购物流程和管理后台功能。 教程特色: 分13个功能模块系统讲解Claude Code应用场景 强调开发方法论:先规划后编码(/plan模式) 重点介绍CLAUDE.md项目规范文档的自动生成与使用 包含数据库设计、页面路由、API设计等完整
2026-06-22 22:08:42
158
原创 AI Skills 技能系统与扩展实践
本文系统介绍了AI Skill技能系统的设计与应用。Skill被定义为封装特定能力的可复用指令集,与单次Prompt相比具有稳定性高、可版本管理、团队共享等优势。文章详细阐述了完整Skill的目录结构(包括核心说明书、辅助脚本、资源模板等),并提供了不同场景下的Skill结构选择建议。同时介绍了官方与社区Skill资源,强调第三方Skill的安全评估要点,通过React组件生成、API端点生成等4个典型案例展示Skill实践。最后讨论了Skill与开发工具的集成方式及版本管理方法。
2026-06-22 22:03:22
320
原创 从工具生态到实战配置:Claude Code 深度使用指南
本文系统介绍了AI编程工具生态及Claude Code的安装配置要点。主要内容包括: AI编程工具分类:分为Agent工具、IDE集成型、平台型Agent和对话式工具四类,Claude Code属于任务执行型Agent。 工具能力分级:从L1代码补全到L5自主工程,Claude Code处于L3任务执行层级。 评估维度:提出8个评估维度,强调工具能力越强越需要配合开发规范。 Claude Code特性:作为能操作本地项目的Agent,采用LLM Loop机制和Agentic Search方式理解代码。
2026-06-22 22:01:35
382
原创 从零搭建AI编程工作台:环境、理论与方法论全解析
AI编程学习笔记摘要 环境搭建 终端是AI编程基本入口,需掌握路径操作命令 Node.js是项目运行基础,需v18+版本并验证安装 Git作为版本控制系统,是AI编程的"后悔药" Python为可选依赖,知识库项目需要 AI编程理论 角色转变:从编码者变为需求定义者和结果审查者 发展四阶段:智能补全→对话式→智能体→协作工程 关键概念:Token、上下文窗口和AI幻觉 方法论: Vibe Coding:快速原型开发 Agentic Engineering:工程化控制 SDD:规范驱动开发 核心价值:搭建可控
2026-06-22 21:59:15
666
原创 LeetCode 380 O(1) 时间插入、删除和获取随机元素
摘要: LeetCode 380题要求实现一个支持O(1)时间插入、删除和随机获取元素的数据结构。核心解法采用"数组+哈希表"组合,数组存储元素实现随机访问,哈希表记录元素位置实现快速查找。删除时通过将末尾元素覆盖待删位置来避免数组移位,确保操作高效性。代码实现中需注意边界条件处理(如删除末尾元素时)和哈希表与数组的同步更新。该方案三大操作均满足O(1)时间复杂度,空间复杂度O(N),是典型的空间换时间策略,关键在于利用哈希表维护元素位置信息与数组随机访问特性的巧妙结合。
2026-06-20 22:09:08
186
原创 LeetCode 199 二叉树的右视图
本文介绍了两种解决LeetCode 199题"二叉树的右视图"的方法。DFS方法通过优先遍历右子树(先右后左),利用深度与结果集长度的关系判断最右节点,具有代码简洁、空间效率高的特点(O(H)空间)。BFS方法采用层序遍历,记录每层节点数量并取最后一个节点,虽然空间复杂度较高(O(N)),但思路直观且适用性广。两种方法各有优劣:DFS适合树深度不大的场景,BFS则更适合需要层序遍历的其他问题。文章通过Java代码示例和对比表格,清晰展示了两者的实现差异和适用场景。
2026-06-19 22:00:16
247
原创 Windows 系统Claude Code安装与使用笔记
本文详细介绍了在Windows系统安装和使用Claude Code的四种方法: 适配系统为Win10(22H2+)和Win11,64位版本 提供四种安装方案: 原生CLI安装(推荐) 无Node一键安装(轻量版) VS Code插件安装(可视化) WSL子系统安装(Linux兼容) 核心准备工作: 获取Claude API Key 可选安装Git for Windows 每种方案都包含详细步骤和环境验证方法,并附有常见问题排查表。 建议新手使用CLI+VS Code插件组合,轻量用户选择一键安装,Linux
2026-06-10 21:01:31
400
原创 LeetCode 4:寻找两个正序数组的中位数 —— 二分查找法
本文介绍了LeetCode第4题"寻找两个正序数组的中位数"的最优解法。通过二分切割法,在不合并数组的情况下直接找到中位数。核心思路是将两个数组分割为左右两部分,确保左半部分整体小于等于右半部分,并满足长度平衡条件。文章详细解释了算法原理、边界处理和中位数计算方法,提供了Java实现代码,并分析了时间复杂度和空间复杂度。最后总结了算法核心思想,并解答了常见的面试问题。该方法时间复杂度为O(log(min(m,n))),是解决该问题的高效方案。
2026-06-10 11:47:23
282
原创 LeetCode 32:最长有效括号 —— 栈 + 标记法 题解
本文介绍了LeetCode 32题"最长有效括号"的栈+标记法解法。通过使用栈来匹配括号对并记录合法位置,再通过标记数组统计最长连续合法段长度。该方法时间复杂度O(n),空间复杂度O(n),具有思路直观、代码简洁、不易出错的优点。关键步骤包括:栈匹配标记合法位置、遍历查找最长连续1段。相比动态规划更简单易懂,是面试中的优选解法。
2026-06-09 17:12:25
261
原创 LeetCode 516:最长回文子序列
本文介绍了LeetCode 516题「最长回文子序列」的解法。该题要求在给定字符串中找到最长的回文子序列(不要求连续字符)。解题采用区间动态规划方法:定义dp[i][j]表示子串s[i...j]的最长回文子序列长度。初始状态为单个字符dp[i][i]=1。状态转移分两种情况:当两端字符相等时,结果为内部区间结果加2;不等时取左右子区间较大值。遍历顺序需从后往前处理左边界,确保正确依赖子问题。最终返回dp[0][n-1]作为答案,时空复杂度均为O(n²)。该解法是处理回文序列问题的经典动态规划模型。
2026-06-09 16:17:51
275
原创 LeetCode 5:最长回文子串(Longest Palindromic Substring)—— 题解
这篇文章介绍了LeetCode第5题「最长回文子串」的动态规划解法。核心思路是定义二维DP数组dp[i][j]表示子串s[i...j]是否为回文,状态转移方程为:首尾字符相等且内部子串是回文则当前区间是回文。解题关键点是左边界i必须逆序遍历以保证子问题先解,同时对长度为1和2的子串单独处理。该方法时间复杂度和空间复杂度均为O(n²),并提供了完整的Java实现代码。文章还提示了面试常见追问点,如遍历顺序原因和空间优化可能,并建议可以进一步使用中心扩展法优化空间复杂度。
2026-06-09 15:07:45
362
原创 回文子串(Palindromic Substrings)—— 题解
本文介绍了LeetCode 647题"回文子串"的动态规划解法。题目要求统计给定字符串中所有回文子串的数量。解题思路采用区间DP方法,定义dp[i][j]表示子串s[i...j]是否为回文。关键点在于:当两端字符相等时,若子串长度≤2或内部也是回文,则该子串为回文。遍历顺序需从大到小处理i,从小到大处理j以确保子问题先计算。解法时间复杂度O(n²),空间复杂度O(n²)。文章还对比了中心扩展法和Manacher算法,并提供了面试加分点,如遍历顺序的选择和空间优化思路。核心思想是:两端字符相等且内部是回文,则
2026-06-09 12:44:05
326
原创 LeetCode 72:编辑距离(Edit Distance)—— 题解
摘要: LeetCode 72题“编辑距离”要求计算将一个字符串转换为另一个字符串所需的最少操作次数(插入、删除、替换)。通过动态规划(DP)解决:定义dp[i][j]为转换word1前i字符到word2前j字符的最小操作数。初始化边界条件后,分字符相同(直接继承状态)或不同(取替换、删除、插入操作的最小值)进行状态转移。时间复杂度和空间复杂度均为O(n×m)。核心思想是DP枚举三种操作的最小代价,需理解状态转移方程的对称性及初始化逻辑,面试时可讨论滚动数组优化。
2026-06-08 22:26:54
407
原创 LeetCode 583. 两个字符串的删除操作
本文对比了LeetCode 72题"编辑距离"的两种动态规划解法。第一种基于最长公共子序列(LCS),通过计算公共部分间接求解,思路为:编辑距离=删除无关字符+插入缺失字符,时间复杂度O(n²)。第二种是标准DP解法,直接定义dp[i][j]为转换所需的最少操作次数,包含替换、删除、插入三种操作的状态转移,同样为O(n²)复杂度。两种方法虽然都正确,但标准DP解法更直观、通用且支持操作权重,是面试推荐的正解。文章建议理解LCS原理,但掌握标准DP写法更为重要。
2026-06-08 22:00:29
235
原创 LeetCode 115 & 392:不同子序列 / 判断子序列
摘要: LeetCode 392(判断子序列)与115(不同子序列)虽同为子序列DP问题,但核心逻辑不同。392判定s是否为t的子序列,状态转移仅依赖当前行;115统计t在s中子序列的出现次数,需累加上一行的两种选择。关键差异:392匹配时长度+1,不匹配继承左侧;115匹配时方案数相加,不匹配继承上一行。复杂度均为O(n²)。核心区别:392找单一路径,115计数所有路径。面试需掌握初始化逻辑(dp[i][0]=1)及空间优化方法。 (字数:149)
2026-06-08 21:23:08
310
原创 LeetCode 1143 & 718:最长公共子序列 / 最长重复子数组
本文对比解析了LeetCode 1143(最长公共子序列LCS)和718(最长重复子数组)两道经典DP题目。核心区别在于是否要求子序列连续: LCS不要求连续,不匹配时可继承dp[i-1][j]或dp[i][j-1]状态; 重复子数组必须连续,不匹配时直接归零。 两题均采用二维DP解法,定义dp[i][j]表示以i-1和j-1结尾的子序列/子数组的最长公共长度。时间复杂度O(n²),空间复杂度O(n²)。关键差异体现在状态转移方程的不匹配处理逻辑上,这是面试高频考点。理解这种连续性要求的差异对掌握DP问题至
2026-06-08 10:43:55
327
原创 LeetCode 300 & 674:最长递增子序列 vs 最长连续递增子序列
本文对比了LeetCode 300和674两道最长递增子序列问题的解法差异。300题求不连续的最长递增子序列,时间复杂度O(n²),需要比较前面所有元素;674题求连续的最长递增子序列,时间复杂度O(n),只需比较前一个元素。关键区别在于状态转移方程的不同:300题需要遍历前面所有更小的数取最大值,而674题仅需判断是否比前一个数大。总结指出300题属于"选或不选"的DP,674题属于"接或不接"的DP,并提出了面试中可能遇到的延伸问题。
2026-06-07 23:07:30
338
原创 LeetCode 188 & 123:股票买卖问题(限制交易次数)—— 联合题解
这篇题解总结了LeetCode 123和188两道股票买卖问题的动态规划解法。核心思路是将交易过程建模为状态机,其中奇数次状态表示持有股票(买入后),偶数次状态表示不持有股票(卖出后)。对于最多k次交易的情况,共有2k+1个状态。文章详细说明了状态转移方程,并给出Java实现代码,包括初始化方法和双层循环遍历过程。特别强调了123题(k=2)是188题(通用k次)的特殊情况。最后总结了时间复杂度为O(n×k),空间复杂度为O(n×k),并提供了面试中可能被问到的关键点。
2026-06-07 22:46:12
239
原创 LeetCode 121 & 122:股票买卖问题(DP 对比题解)✅
本文对比了LeetCode 121和122两道股票买卖问题的动态规划解法。121题限制只能买卖一次,122题允许无限次交易,两题的核心区别在于持有股票状态转移方程的不同:121题使用-prices[i]表示第一次买入,122题则使用dp[i-1][0]-prices[i]考虑之前交易的利润。文章提供了两种解法的AC代码、状态转移分析、复杂度比较和空间优化方案,最后总结指出两题差异仅在于持有股票状态的转移逻辑。
2026-06-06 23:09:15
285
原创 LeetCode 337:打家劫舍 III(House Robber III)—— 题解 ✅
本文是关于LeetCode 337题"打家劫舍III"的题解。题目要求在不触发警报(不能同时偷窃相邻父子节点)的情况下,计算二叉树结构房屋中能偷窃的最高金额。解题采用树形DP方法,定义每个节点返回"偷/不偷"两种状态的最大值数组,通过后序遍历自底向上计算。时间复杂度O(n),空间复杂度O(h)。关键点包括状态转移方程设计、后序遍历顺序选择,以及与线性/环形版本打家劫舍问题的对比。文章提供了Java代码实现,并总结了树形DP的核心思路和面试加分点。
2026-06-06 22:23:52
244
原创 LeetCode 213:打家劫舍 II(House Robber II)—— 题解 ✅
摘要 LeetCode 213题"打家劫舍II"是第198题的环形版本,关键区别在于房屋围成一圈,首尾相连。解题核心思想是将环形问题拆分为两个线性子问题:分别考虑偷窃第1间到第n-1间,以及第2间到第n间,然后取两种情况的最大值。采用动态规划解法,状态转移方程与198题相同,通过复用线性问题的解决方案来处理环形限制。时间复杂度O(n),空间复杂度O(n)(可优化为O(1))。面试时需理解拆解环形的必要性及其正确性证明,并能与线性、树形打家劫舍问题进行对比分析。
2026-06-06 16:05:53
366
原创 LeetCode 198:打家劫舍(House Robber)—— 题解 ✅
题目“LeetCode 198:打家劫舍”要求在不触动相邻房屋警报的前提下,计算一夜内能偷窃的最大金额。核心思路是动态规划:定义dp[i]为到第i间房时的最大金额,状态转移方程为dp[i] = max(dp[i-1], dp[i-2] + nums[i]),即选择偷或不偷当前房屋。边界条件为单间房或两间房时的处理。代码实现时间复杂度O(n),空间复杂度可优化至O(1)。面试需掌握状态转移逻辑、空间优化及与环形房屋变种的关系。
2026-06-06 15:46:00
257
原创 LeetCode 377:组合总和 Ⅳ(Combination Sum IV)—— 题解 ✅
这是一道关于完全背包排列计数问题的LeetCode题解。题目要求计算不同顺序的组合总和个数,本质是排列问题。关键点在于正确的动态规划遍历顺序:外层循环枚举金额j,内层循环枚举所有数字nums[i],这样能保证不同顺序被视为不同组合。时间复杂度O(target×n),空间复杂度O(target)。与组合问题(零钱兑换II)对比,排列问题需要先遍历金额后遍历物品,而组合问题则相反。
2026-06-05 21:41:38
168
原创 LeetCode 518:零钱兑换 II(Coin Change II)—— 题解 ✅
本文解析了LeetCode 518题「零钱兑换II」的解题思路,核心是将其视为完全背包的组合计数问题。关键点在于正确的动态规划遍历顺序:外层循环遍历硬币种类(物品),内层循环遍历金额(背包),确保统计的是组合数而非排列数。状态转移方程为dp[j] += dp[j-coins[i]],初始条件dp[0]=1。文章强调遍历顺序决定是组合数还是排列数,并给出了Java实现代码,时间复杂度O(n×amount),空间复杂度O(amount)。最终总结:完全背包组合问题应采用「先物品后背包」的正序解法。
2026-06-05 21:20:39
230
原创 LeetCode 474:一和零(Ones and Zeroes)—— 题解 ✅
本文介绍了LeetCode 474题"一和零"的解题思路。该问题要求从二进制字符串数组中选出最大子集,使其中0和1的总数分别不超过给定限制m和n。解题关键在于将其转化为二维0/1背包问题,每个字符串视为消耗x个0和y个1的物品,价值为1。使用动态规划,定义dp[i][j]表示使用不超过i个0和j个1能组成的最大字符串数量,通过倒序遍历进行状态转移。时间复杂度为O(k×m×n),空间复杂度为O(m×n)。文章还对比了不同背包问题的特点,并总结了面试常见考察点。
2026-06-05 16:11:09
230
原创 LeetCode 494:目标和(Target Sum)—— 题解 ✅
摘要 LeetCode 494题"目标和"要求通过给非负整数数组的每个元素添加正负号,使计算结果等于目标值。解题关键在于数学转化:将问题转化为求子集和等于特定值P的方案数,其中P=(sum+target)/2。使用动态规划解决,定义dp[j]表示和为j的方案数,状态转移方程为dp[j] += dp[j-nums[i]]。需注意剪枝条件和初始化dp[0]=1。时间复杂度O(n×sum),空间复杂度O(sum)。该题与416、1049题同属子集和问题,区别在于DP含义不同。面试中需掌握数学转化原理和DP设计思路
2026-06-05 15:03:12
268
原创 LeetCode 1049:最后一块石头的重量 II —— 题解 ✅
摘要: LeetCode 1049题要求将一堆石头两两粉碎(剩余重量为差值),求最后石头的最小可能重量。解题核心是将其转化为0/1背包问题:将石头分为两堆,使两堆总重量尽可能接近(即差值最小)。通过动态规划计算背包容量为sum/2时的最大装载量,最终结果为sum - 2*dp[target]。此题是分割等和子集的变形,时间复杂度O(n×sum),空间复杂度O(sum)。关键思路是将问题转化为背包模型,寻找最优分割方案。
2026-06-05 14:29:53
332
原创 LeetCode 96:不同的二叉搜索树(Unique Binary Search Trees)—— 题解 ✅
LeetCode 96:不同的二叉搜索树 摘要 这道题要求计算由1到n组成的互不相同的二叉搜索树(BST)的总数。解题核心在于动态规划:定义dp[i]表示i个节点组成的BST数量。对于每个可能的根节点j,BST数量等于左子树(j-1个节点)和右子树(i-j个节点)数量的乘积之和。初始条件dp[0]=1(空树算一种)。该问题实质上是计算卡特兰数(Catalan Number),其递推公式为dp[i] = Σ(dp[j-1]*dp[i-j])。Java实现使用双重循环,时间复杂度O(n²),空间复杂度O(n)。
2026-06-04 14:58:00
225
原创 LeetCode 62 & 63:不同路径 I & II(含障碍物)
本文讲解了LeetCode 62和63题关于不同路径问题的动态规划解法。题目描述机器人在m×n网格中从左上角移动到右下角,每次只能向右或向下移动一步。62题是无障碍版本,63题增加了障碍物限制。解题采用二维DP,状态定义为dp[i][j]表示到达(i,j)的路径数。状态转移方程为dp[i][j] = dp[i-1][j] + dp[i][j-1]。初始化时,62题首行首列全为1,63题遇到障碍物则中断。63题需额外处理障碍物格子,将其路径数设为0。时间复杂度O(m×n),空间复杂度O(m×n)。两题核心思路
2026-06-04 14:06:55
289
原创 LeetCode 746:使用最小花费爬楼梯 —— 题解笔记
LeetCode 746题解摘要 题目要求计算爬楼梯的最小花费,每次可跨1或2阶,需支付当前台阶费用。采用动态规划求解: 状态定义:dp[i]表示到达第i阶的最小花费(未支付cost[i]) 转移方程:dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]) 初始条件:dp[0]=dp[1]=0(可从0或1阶出发) 复杂度:时间O(n),空间可优化至O(1) 关联题型:与斐波那契、爬楼梯同源,构成DP学习路径(基础递推→组合计数→带权最优解) 面试要点:本质是带权爬
2026-06-04 13:09:10
236
原创 LeetCode 416:分割等和子集 —— (0-1背包)
题目LeetCode 416要求判断一个正整数数组是否能分成两个和相等的子集。解题关键是将其转化为0/1背包问题:是否存在子集的和等于数组总和的一半。首先排除总和为奇数的情况,然后使用动态规划,其中dp[j]表示容量为j的背包能装的最大价值。通过逆向遍历背包容量,确保每个数只使用一次。最终检查dp[target]是否等于目标值即可。时间复杂度为O(n×sum),空间复杂度为O(sum)。核心思路是将问题转化为背包能否恰好装满。
2026-06-04 12:03:13
335
原创 LeetCode 295:数据流的中位数(Median Finder)—— Java 题解 ✅
这篇文章详细讲解了如何高效解决LeetCode 295题"数据流的中位数"问题。核心思路是使用大小顶堆组合:大顶堆(left)存储较小的一半数字,小顶堆(right)存储较大的一半。通过巧妙维护两个堆的大小关系(left.size()等于或比right.size()大1),确保中位数始终位于堆顶。文章详细分析了插入元素时的两种情况和平衡策略,给出了Java实现代码,并分析了时间复杂度(插入O(log n),查询O(1))。最后总结了这种双堆方法的优势及面试可能的扩展问题。
2026-06-03 22:52:34
186
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅