自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(176)
  • 收藏
  • 关注

原创 专题四:ref 的实现

Reactive 是 Proxy,针对对象,自动拦截。Ref 是 Class,针对基本类型(或对象),利用 getter/setter 拦截.value。Ref 包裹对象时,内部其实还是调用的 Reactive。依赖收集差异Reactive 依赖全局targetMap(WeakMap)。Ref 依赖实例内部的this.dep(Set)。proxyRefs这是 Vue 3 在模板中自动脱 ref 的原理,本质上是一个针对 ref 特殊处理的 Proxy。

2026-01-09 13:07:14 663

原创 专题三:完善响应式 —— readonly 与 isReactive

代码重构 (Refactoring)通过(高阶函数) 传递isReadonly参数,我们用一套逻辑同时处理了reactive和readonly,大大减少了重复代码。Flags 模式isReactive的实现原理不是在对象上真的加了一个属性,而是通过拦截 get。你问我 "你是 Reactive 吗?"(访问),如果是 Proxy,我就拦截回答 "Yes";如果是普通对象,没人拦截,自然返回undefined。Readonly 的优化readonly不会变,所以不需要 track。

2026-01-09 13:06:16 481

原创 专题二:核心机制 —— reactive 与 effect

Proxy: 是响应式的拦截器,它不需要像 Vue 2 那样递归遍历对象属性,而是懒拦截(访问到了才拦截)。: 这是 Vue 3 存储依赖的数据结构金字塔。WeakMap: 存 Target 对象 (如果不被引用了,自动回收)。Map: 存 Target 的 Key。Set: 存 Key 对应的 Effect 集合 (Set 可以自动去重,防止重复添加同一个 effect)。: 一个全局指针,巧妙地解决了 "如何在 get 中获取当前正在执行的函数" 这个问题。

2026-01-08 11:38:20 846

原创 专题一:搭建测试驱动环境 (TypeScript + Vitest)

Vitest: 我们选用的测试框架。它的特点是快,且对 ESM (import/export) 支持极好。.spec.ts: 这是测试文件的约定俗成命名,Vitest 会自动扫描所有带.spec或.test的文件并运行。TDD 流程以后做每一个功能(比如reactive),我们都会先写.spec.ts。运行测试 -> 报错 (Red)。去写代码实现逻辑。再次运行 -> 通过 (Green)。重构代码 (Refactor)。

2026-01-08 11:21:19 468

原创 链表专题(九):应用篇的无冕之王——「LRU 缓存机制」

本文介绍了LRU(最近最少使用)缓存算法的实现原理与代码实现。核心思路是结合哈希表和双向链表:哈希表实现O(1)查找,双向链表维护使用顺序。当缓存容量不足时,淘汰链表尾部的节点。具体实现包括:定义节点类、初始化虚拟头尾节点、实现get和put操作,以及关键的链表操作辅助函数(addToHead、removeNode、moveToHead、removeTail)。该算法能高效维护缓存数据的访问顺序,保证get和put操作的时间复杂度均为O(1)。文章最后通过一个容量为2的示例,演示了LRU缓存的工作流程。

2026-01-07 15:06:44 815

原创 链表专题(八):精细操作的巅峰——「K 个一组翻转链表」

这道题虽然难,但只要你引入了helper 函数 (reverse,主逻辑就会变得非常清晰。它是LC 206 (反转)的多次调用。它是Dummy Head的经典应用。它是指针断链与重连的集大成者。下一题预告:LRU 缓存拿下这个 Hard 之后,纯算法层面的链表题你已经通关了!🎉最后一道压轴题 LC 146. LRU 缓存(专题九),我们不再是单纯地翻转指针,而是要设计一个数据结构。这是一个工程题,也是 Vue、React 源码里缓存机制的简化版。你需要结合HashMap和双向链表。

2026-01-07 15:05:16 899

原创 链表专题(七):三大招式组合拳——「重排链表」

这道题虽然代码长,但逻辑非常清晰。它其实就是:LC 876 (找中点) + LC 206 (反转) + 链表拼接。易错点:找完中点后,一定要记得断开链表!否则左半段的尾巴还连着右半段,反转后会形成环,导致死循环。下一题预告:K 个一组翻转链表恭喜你拿下了综合题!下一题是 LC 25. K 个一组翻转链表(专题八)。这是链表题里的 Hard 难度,也是字节跳动等大厂面试官最喜欢用来“劝退”或者“定级”的题目。,K=2。。。这道题是对指针操作精细度的终极考验。准备好迎接这个 Boss 了吗?😎。

2026-01-07 15:04:01 357

原创 链表专题(六):数学与指针的完美结合——「环形链表 II」

这道题是链表进阶篇的完美句号。它不光考代码,还考逻辑推理。“相遇后,一个从头走,一个从相遇点走,每次一步,相遇即入口。

2026-01-06 11:55:45 1018

原创 链表专题(五):殊途同归——「相交链表」

这道题的代码极简,但背后的思维非常巧妙。面试官问:如果不能修改链表结构(不能翻转),且空间复杂度要求 $O(1)$(不能用 Set 存节点),怎么做?标准答案:就是这种**“双指针拼接”法。“我走完我的路,就去走你的路。”**下一题预告:环形链表 IILC 142. 环形链表 II(专题六)。题目:给定一个链表,如果它有环,请找到入环的那个节点。难点:判断有环很简单(快慢指针追击),但怎么找到入口?这又是一道数学推导题。你需要证明:当快慢指针相遇时,再派一个指针从头开始走,它和慢指针会在入口处相遇。

2026-01-06 11:54:23 743

原创 链表专题(四):一把尺子的智慧——「删除链表的倒数第 N 个结点」

这道题是**“固定间距双指针”**的教科书级应用。关键点:只要看到“倒数第 K 个”,马上反应过来 ->让快指针先走 K 步。细节:为了方便删除,我们通常让快指针多走一步(或者判断条件改为fast.next!== null),目的是拿到前驱节点。下一题预告:相交链表刚才我们用两个指针一前一后跑。下一题 LC 160. 相交链表(专题五),我们要让两个指针在两条不同的路上跑。题目:给你两个链表 A 和 B,它们在某个节点汇合了(变成 Y 字形)。请你找到这个交点。

2026-01-06 11:52:45 233

原创 链表专题(三):双人舞的艺术——「两两交换链表中的节点」

这道题是“多指针操作”的典型训练。不要试图要在脑子里模拟三根线的变化,一定会晕。一定要画图,把步骤 1、2、3 标在纸上,代码自然就写出来了。只要掌握了这题,后面的 K 个一组翻转(LC 25)其实就是把“两两”变成了“K个”,逻辑是一模一样的。下一题预告:删除链表的倒数第 N 个结点练完了细致的指针操作,下一题LC 19. 删除链表的倒数第 N 个结点要考一点**“小聪明”**了。题目:只扫描一遍链表,怎么找到倒数第 N 个节点?快慢指针。让快指针先跑 N 步,然后两个指针一起跑。

2026-01-04 10:49:54 681

原创 链表专题(二):乾坤大挪移——「反转链表」

这道题看似简单,但它是链表题的绝对核心。面试技巧:在纸上画出precurtemp三个指针的移动过程,会让你的思路非常清晰。记忆口诀“存下一步,回头指,双双向前挪”。下一题预告:两两交换链表中的节点接下来我们要把难度稍微提升一点点。LC 24. 两两交换链表中的节点输入输出这道题不仅要反转指针,还要维护好节点之间的连接关系。如果说刚才是一个人向后转,现在就是两个人一组跳交谊舞交换位置。你需要同时操作 4 个指针!准备好挑战一下你的逻辑清晰度了吗?

2026-01-04 10:48:34 474

原创 链表专题(一):以退为进的智慧——「移除链表元素」

这道题是链表的**“第一课”**。凡是涉及“头结点可能会变”的操作(如删除、插入、翻转),无脑使用 Dummy Head,绝对没错。下一题预告:反转链表如果说这道题是热身,下一题LC 206. 反转链表就是真正的实战。这是一个需要你闭着眼睛都能写出来的算法。它是“K个一组翻转”、“回文链表”等所有高阶题目的基石。准备好去扭转指针的方向了吗?

2026-01-04 10:47:43 598

原创 双指针专题(十):恰好等于的困境——「K 个不同整数的子数组」

恭喜你!🎉 到这里,我们的双指针与滑动窗口专题就彻底结业了!我们从最简单的快慢指针(移除元素)开始,一路打怪升级,经过了对撞指针(三数之和)、不定长窗口(最小覆盖子串),最后攻克了单调队列(滑动窗口最大值)和数学转换(K个不同整数)。

2026-01-03 15:51:06 898 1

原创 双指针专题(九):谁是窗口里的老大?——「滑动窗口最大值」

这道题是单调队列的入门即巅峰。一旦新来的比你强,你就被淘汰了(pop);即使你是最强的,时间到了也得走人(shift)。下一题预告:K 个不同整数的子数组这一题(LC 239)解决的是“窗口内的最值”。下一题LC 992. K 个不同整数的子数组(专项十),我们要解决的是一个极具数学技巧的计数问题。题目:求有多少个子数组,恰好包含K种不同的整数。难点:直接求“恰好 K”很难。我们需要把问题转化为“最多 K” - “最多 K-1”。这是一个非常高级的滑动窗口思想。准备好迎接双指针专题的大结局了吗?

2026-01-03 15:49:51 480

原创 双指针专题(八):步长跳跃的艺术——「串联所有单词的子串」

这道题是 LC 438 的进阶版,也是 LC 76 的变种。它强迫你把“字符”的微观视角,转换成“单词块”的宏观视角。关键点 1:外层循环遍历0到,消除“相位差”。关键点 2:内层循环的步长是wordLen。关键点 3:遇到非法单词直接,这是极大的优化(剪枝)。下一题预告:滑动窗口最大值拿下了这道“步长跳跃”的难题,下一关我们要去挑战一个需要特殊武器的题目——LC 239. 滑动窗口最大值(Hard)。题目很简单:一个窗口滑过数组,每次告诉你窗口里最大的那个数是谁。陷阱。

2026-01-03 15:48:43 489 1

原创 双指针专题(七):覆盖所有需求的最小代价——「最小覆盖子串」

拿下这道题,不定长滑动窗口这一块你就彻底毕业了。它的模板是所有滑动窗口里最全的:Map 统计需求。valid变量判断状态。进行收缩优化。

2026-01-02 13:03:22 874

原创 双指针专题(六):贪婪的采摘者——「水果成篮」

这道题是“至多包含 K 个不同字符的最长子串”问题的标准模板(本题 K=2)。如果你以后遇到求“至多 K 个”的题目,直接把代码里的改成即可直接秒杀。下一题预告:最小覆盖子串好了,简单的滑动窗口结束了。我们要迎来双指针专题的终极 BOSS——LC 76. 最小覆盖子串(Hard)。之前的题都是窗口**“太胖了”**(超标了)才收缩。这道题正好相反:窗口**“太瘦了”(还没凑齐目标字符)就要扩张,一旦“吃饱了”(凑齐了)就要开始拼命收缩**,试图找到一个最短的、能满足要求的窗口。

2026-01-02 13:02:25 545

原创 双指针专题(五):灵活的起跳——「无重复字符的最长子串」

滑动窗口 + 哈希索引优化。普通滑动窗口是left++一步步挪,而这道题利用 Map 实现了left的精准空降。记住那个坑:left = Math.max(left, map.get(c) + 1)。这是防止“时光倒流”的护身符。下一题预告:水果成篮做完了“无重复的最长子串”,下一题LC 904. 水果成篮(Medium) 就是它的孪生兄弟。题目:你有两个篮子,每个篮子只能装一种类型的水果。目标:找到最长的连续子序列,使得其中至多包含两种不同的元素。比如-> 最长是,长度 4。

2026-01-02 13:01:29 529

原创 双指针专题(四):像毛毛虫一样伸缩——「长度最小的子数组」

在收缩窗口的时候:JavaScript很多初学者会写成 if。如果是 if,意味着你每加进来一个新数字,左边最多只缩一步。但在本题中,假设 nums = [1, 1, 1, 1, 100], target = 100。当right走到100时,sum变成了 104。此时满足条件。如果你只缩一步(去掉第一个 1),sum变成 103,还是满足条件,其实应该继续缩!我们需要把左边的1, 1, 1, 1全部缩掉,只留下[100],才能得到最优解。所以必须用 while,直到不能缩为止。这道题是。

2026-01-02 13:00:32 566

原创 双指针专题(三):去重的艺术——「三数之和」

这道题是双指针的里程碑。掌握了它,你就掌握了 “排序 + 降维 + 双指针夹逼 + 细致去重” 的完整套路。下一题预告:四数之和如果面试官觉得三数之和太简单,可能会随手丢给你一道LC 18. 四数之和。题目:找到。套娃。三数之和是:固定i,算两数之和。四数之和是:固定k,再固定i,算两数之和。难点:多了一层循环,也就多了一层剪枝和去重的逻辑。准备好再加一层循环了吗?下期见!

2026-01-01 13:44:54 1003

原创 双指针专题(二):两头堵的智慧——「有序数组的平方」

这道题展示了双指针处理有序数组的强大能力。只要看到“有序数组”或者“数组部分有序”,且要求找“最大/最小/目标和”,第一反应就应该是左右指针。“从两头往中间找,从后往前填结果”。下一题预告:三数之和接下来我们要进入双指针专题的深水区了—— LC 15. 三数之和 (Medium)。这是大厂面试中出现频率最高的算法题之一(绝对的 Top 5)。题目:给你一个数组,判断是否存在三个数a, b, c使得?找出所有不重复的三元组。难点:怎么把三数之和降维?(还是用双指针)。怎么去重?(比如数组里有三个。

2026-01-01 13:44:10 640

原创 双指针专题(一):其实是“覆盖”元素——「移除元素」

这道题是双指针最基础的应用——原地操作数组。快指针找,慢指针填。这种“覆盖”的思想在后面很多题目(比如“移动零”、“删除有序数组重复项”)中都会用到,是必须掌握的肌肉记忆。下一题预告:有序数组的平方好了,热身结束。下一题我们稍微加点难度。给你一个按非递减顺序排序的整数数组。要求返回每个数字的平方组成的新数组,也要按非递减顺序排序。。负数平方后可能变得很大。最大的数可能在最左边(负数),也可能在最右边(正数)。这时候,如果还在用快慢指针从一头往另一头跑,肯定不行。我们需要两个指针,分别站在数组的两头。

2026-01-01 13:43:24 771

原创 贪心算法专题(十六):完美落幕的终极监控——「监控二叉树」

恭喜你!坚持到了这里。这道题融合了树的遍历状态机局部贪心,是当之无愧的贪心压轴题。基础:分发饼干(排序+匹配)。序列:摆动序列(视觉上的峰谷)。股票:买卖股票 II(收集每一滴利润)。覆盖:跳跃游戏 I & II(维护最大范围)。维度:分发糖果、重建队列(拆分维度,逐个击破)。区间:射气球、无重叠、合并区间(Start排序 + 边界更新,这是最重要的模板!数字:单调递增数字(借位思想)。树形:监控二叉树(自底向上状态推导)。掌握了这些,你已经建立了一套完整的**“贪心直觉”。

2025-12-31 16:07:30 767

原创 贪心算法专题(十五):借位与填充的智慧——「单调递增的数字」

这道题虽然代码简单,但包含了贪心算法中**“局部调整影响全局”**的思想。局部最优:遇到逆序就借位,保证当前位不违规。全局最优:借位后把后面全变 9,保证数值最大。下一题预告:监控二叉树准备好了吗?我们要迎来贪心算法的最终大 Boss——LC 968. 监控二叉树(Hard)。这是一道树形 DP 和贪心结合的题目,难度远超刚才的糖果和气球。题目:给定一棵二叉树,我们在节点上安装摄像头。每个摄像头能监控自己、父节点、子节点。目标:用最少的摄像头监控整棵树。永远不要把摄像头放在叶子节点上!为什么?

2025-12-31 16:06:09 953

原创 贪心算法专题(十四):万流归宗——「合并区间」

这三道题(452射气球, 435无重叠, 56合并)是区间问题的“三驾马车”。它们的第一步永远是。区别在于处理重叠时的贪心决策题目目标重叠时的操作边界更新策略452. 射气球找公共交集箭数不变,范围变小(取交集)435. 无重叠丢弃区间移除数+1,保留短的(为了不挡路)56. 合并区间融合区间区间数不变,范围变大(取并集)记住这个表格,区间问题就通关了!

2025-12-31 16:03:24 985

原创 贪心算法专题(十三):画地为牢的艺术——「划分字母区间」

这道题展示了贪心算法处理**“动态约束”的能力。最开始约束很小(只看第一个字母),随着遍历的进行,新加入的字母可能会“撑大”**这个约束(更新end我们只能顺从这个约束,直到我们走到了约束的尽头。下一题预告:合并区间接下来这道题LC 56. 合并区间,是区间问题的终极模板,也是面试中出现频率最高的题目之一(Top 3 级别)。给你一堆乱序的区间。让你把重叠的区间全部合并成一个大区间。比如[1,3]和[2,6]重叠,合并成[1,6]。

2025-12-31 15:57:57 836

原创 贪心算法专题(十二):为了大局,必须有人退出——「无重叠区间」

恭喜你!学会这一题,你其实已经掌握了**“区间调度”**的核心奥义。不管面试官问“最少用几间会议室”、“最多能参加几个活动”、“最少删掉几个区间”,只要涉及区间重叠,排序 + 贪心(Min/Max)永远是你的第一把斧头。下一题预告:划分字母区间接下来这道题(LC 763)稍微换了个马甲。给你一个字符串。同一个字母只能出现在同一段里。比如a如果在第一段出现了,那整个字符串里所有的a都必须在第一段里,不能跑出去。求:尽可能切出最多的片段。这道题其实是**“找区间最远边界”**的变种。

2025-12-30 22:02:41 544

原创 贪心算法专题(十一):一箭双雕的快乐——「用最少数量的箭引爆气球」

排序(通常按 Start 排序)。判断重叠更新边界(取 Min 还是 Max 看具体需求)。下一题预告:无重叠区间如果你理解了这一题,那么下一题 LC 435. 无重叠区间 你只需要改两行代码就能通过。题目问:给定一堆区间,最少移除几个区间,才能让剩下的区间都不重叠?思考一下:“最少移除几个”是不是等价于“最多保留几个(不重叠的)”?而“最多保留几个不重叠的区间”是不是和“最少用几支箭引爆所有气球”有着某种神秘的数学联系?(提示:其实就是一模一样的题!下期见!

2025-12-30 16:13:04 963

原创 贪心算法专题(十):维度权衡的艺术——「根据身高重建队列」

这道题是解决多维度冲突问题的教科书级案例。当我们在两个维度(身高、k值)之间摇摆不定时,试着先固定一个维度(身高),看看是否能消除另一个维度的不确定性。确定了由高到低排,k就变成了纯粹的“绝对索引”。下一题预告:用最少数量的箭引爆气球接下来,我们将进入贪心算法中最实用、最成体系的**“区间问题”**板块(共 4 题)。给你一堆气球,每个气球覆盖一个水平区间。你可以垂直射箭。问最少射几箭能把所有气球都打破?这道题将教会我们如何处理重叠区间。

2025-12-30 16:11:41 975

原创 贪心算法专题(九):左顾右盼太累,不如分头行动——「分发糖果」

这道题之所以被标记为 Hard,是因为如果试图在一个循环里搞定左右两边,代码会变得极其复杂(需要回溯修改)。但一旦使用了**“两次贪心,分别处理”**的策略,这道题就瞬间降维成了两道 Easy 题的叠加。记住这个套路:当你发现一个元素需要同时满足左右两个邻居的约束时,试着先满足一边,再满足另一边。下一题预告:根据身高重建队列接下来这道题(LC 406),同样是关于**“两个维度”**的权衡。h(身高),k(前面比我高的人数)。你需要给所有人重新排队,让每个人的k属性都成立。面对这种由(h, k)

2025-12-30 16:10:45 880

原创 贪心算法专题(八):绝处逢生的起点——「加油站」

这道题最难理解的地方在于:为什么 totalSum >= 0 且 curSum 在最后一段非负,就一定能保证绕圈成功?这涉及到一个数学证明:如果总和非负,那么一定存在一个起点,使得所有前缀和非负。我们通过贪心策略抛弃了所有“前缀和为负”的区间,剩下的那个起点,就是那个“天选之子”。遇到困难(负数),立刻止损,跳过整段困难区间,寻找新的希望。下一题预告:分发糖果接下来这道题是贪心算法的Hard级别题目,也是面试中的“终极杀手”。一群孩子排排坐,每个孩子有评分。每个孩子至少一颗糖。相邻的孩子,评分高。

2025-12-29 10:51:11 769

原创 贪心算法专题(七):负负得正的极致——「K 次取反后最大化数组和」

这道题教会了我们如何建立贪心优先级最高优先级:消除“大负数”(收益最大)。次高优先级:消除“小负数”。最低优先级(迫不得已):牺牲“小正数”(损失最小)。通过排序,我们将这些优先级线性化,从而一趟扫描解决问题。下一题预告:加油站接下来我们要挑战贪心算法中最经典、也最容易让人懵圈的题目——“加油站”。你有一个油箱无限大的车,想绕环形公路跑一圈。每个加油站有油gas[i],去下一站消耗cost[i]。你需要找一个起点,保证能跑完一圈。贪心策略非常神奇:如果你尝试从 A 跑到 B,发现油不够了,那么。

2025-12-29 10:50:06 659

原创 贪心算法专题(六):步步为营的极速狂飙——「跳跃游戏 II」

这道题展示了贪心算法中**“动态规划式”的思维(虽然没用 DP 数组)。我们把跳跃过程看作是一层一层的波纹**:第 1 步能到的范围是 A。第 2 步能到的范围是 B (由 A 中的点跳出来的)。我们只需要记录波纹的边缘,每碰到一次边缘,步数就 +1。如果数组中有负数怎么办?K 次取反后最大化数组和。你可以选择任意一个元素取反(乘 -1),这个操作必须执行 K 次。先把绝对值最大的负数变成正数;如果负数都变完了 K 还没用完,那就对着最小的非负数反复取反(消耗 K)。下期见!

2025-12-29 10:49:13 1135

原创 贪心算法专题(五):覆盖范围的艺术——「跳跃游戏」

这道题展示了贪心算法的一种**“宏观视角”。我们没有去纠结微观的“第一步跳几米,第二步跳几米”,而是直接审视“势能”**(覆盖范围)。只要我的势能足够大,能罩住终点,那具体怎么跳,总归是有办法的。下一题预告:跳跃游戏 II现在难度升级了!如果在上一题的基础上,我保证一定能跳到终点,但我要求你求出最少跳几步能到?这时候,“最大覆盖范围”这个单一指标就不够用了。“当前这一步最远能到哪”和“下一步最远能到哪”。这道题是贪心算法中逻辑稍微复杂一点的题目,准备好烧脑了吗?下期见!

2025-12-29 10:48:04 537

原创 贪心算法专题(四):只赚不赔的股市神话——「买卖股票的最佳时机 II」

这道题展示了贪心算法通过**“数学等价转换”简化问题的能力。我们将一个需要寻找波峰波谷的复杂决策问题,简化成了一个简单的加法问题**。只要,就加!就这么简单。下一题预告: 如果我们不是在炒股,而是在玩**“跳跃游戏”。给你一个数组,每个格子里的数字代表你能向右跳的最大步数**。请问你能否跳到终点?这道题的贪心策略不再是累加收益,而是维护一个**“最大覆盖范围”**。只要终点在我的覆盖范围内,我就赢了!下期见!

2025-12-18 20:27:11 650

原创 贪心算法专题(三):负重前行,不如从头再来——「最大子序和」

今天这道题的贪心哲学非常实用:不要因为沉没成本而犹豫。当你发现当前的积累(count)已经变成负资产时,无论之前付出了多少努力(遍历了多少元素),都要果断“归零”,轻装上阵,才能在未来(后面的序列)取得更大的成就(result下一题预告: 如果我们在炒股,这就更刺激了。假设你能预知未来几天的股价,并且可以无限次地买入卖出(T+0,当天买当天卖都行),你怎么操作才能赚得最多?只要今天比昨天贵,我就赚这个差价!下期见!

2025-12-18 20:26:14 708

原创 贪心算法专题(二):波动中的智慧——只取极值「摆动序列」

今天这道题,如果只看数字,很容易被“平坡”、“删除元素”绕晕。我们只想要山顶和谷底,山腰上的石头全扔掉!这就是贪心算法的魅力——通过忽略中间过程(单调区间),直接抓住关键变化(转折点)。下一题预告: 如果我们在一个数组中寻找**“和最大”的连续子数组**(最大子序和),贪心算法该如何操作?策略很简单:如果当前的累加和变成了负数,它对未来不仅没有贡献,还是个累赘,那我们就果断抛弃它,从头开始算!下期见!

2025-12-18 20:25:19 854

原创 贪心算法专题(一):局部最优的魔力——“抠门”的「分发饼干」

排序:大多数贪心问题,都需要在有序的数据上才能进行“最优选择”。如果题目没给有序数组,你往往需要先sort。局部最优 -> 全局最优局部最优:这块饼干哪怕只比孩子的胃口大一点点,我也给它用了,绝不浪费更大的饼干。全局最优:最后喂饱的孩子最多。这种**“没有后效性”**(现在的选择不会影响未来的可行性,只会让未来更好做)是贪心算法生效的基础。下一题预告: 如果情况稍微复杂一点,我们面对的不是静态的饼干,而是一个波动的序列。我们要在一个忽高忽低的序列中,统计“峰值”和“谷值”的变化次数(摆动序列)。

2025-12-12 20:19:26 808

原创 回溯算法专题(十):二维递归的完全体——暴力破解「解数独」

恭喜你!这道题通过,标志着你已经攻克了回溯算法最险峻的山峰。组合/子集startIndex控制不回头,path收集结果。排列used数组控制不重复选,关注顺序。切割startIndex作为切割线,判断子串合法性。去重sort剪掉树层重复。棋盘N 皇后:一维决策(行),二维约束。解数独:二维决策(每个格子),找唯一解(bool 返回值)。这一套组合拳打下来,所有的暴力搜索问题在你面前都将无所遁形。接下来学什么?我们已经完成了:DP(内功)、图论(招式)、回溯(暴力美学)。

2025-12-12 20:14:06 499

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除