- 博客(208)
- 收藏
- 关注
原创 【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
掌握 GitHub Desktop 和开源协作流程是现代开发者必备的核心技能。熟练使用 GitHub Desktop 进行日常版本控制理解并实践 GitHub 的 Fork-PR 协作模型自信地参与开源项目贡献高效管理个人和团队项目开源协作的黄金法则“在你自己的沙盒中自由创造,通过严谨的流程贡献价值。
2025-06-09 12:52:10
543
原创 【Hot 100】139. 单词拆分
dp[i] 的计算需要遍历字典中每个字符串进行匹配。匹配的时候也需要将 s 的子串进行拆分,因为字典中的字符串可以只匹配后半段,前半段的状态沿用 dp[i-len] 即可。只有当 s.substr(i - len, len) 和 wordDict[j] 相等并且 dp[i - len] 也为 true 时,当前的子串才能进行拆分。解题思路:因为当前字符串能否拆分可以由前面子串能够拆分的状态推导过来,所以采用dp的方法来求解。dp[i] 表示前 i 个元素组成的子串能否拆分。
2025-06-08 10:54:20
405
原创 【Hot 100】322. 零钱兑换
开始对dp数组的定义有了一点感觉。题目是求解凑齐 amount 的最小硬币数量,所以 dp 数组就是从 0 到 amount 的一个数组。直到计算出 dp[amnout]。
2025-06-05 17:15:51
618
原创 【Hot 100】279. 完全平方数
DP 三要素的完整框架状态定义:明确 dp[i] 的具体含义(如您的定义:dp[i] 表示和为 i 的最小完全平方数数量)。转移方程:如何从子问题推导当前问题(如 dp[i] = min(dp[i - j²] + 1))。初始条件:边界值的处理(如 dp[0] = 0,dp[1] = 1)。DP 的两种实现方式自顶向下(记忆化搜索):递归 + 备忘录,适合问题结构不直观时。自底向上(迭代填表):您的代码采用的方式,更高效且避免递归开销。常见 DP 类型线性 DP(如斐波那契、爬楼梯)。
2025-06-03 22:37:23
693
原创 【Hot 100】70. 爬楼梯
仔细观看上面的代码可以发现,dp数组在计算的过程中只依赖前面两个状态,所以可以将存储空间进行压缩。只需要两个额外变量来记录就行。
2025-06-02 10:38:41
427
原创 【Hot 100】763. 划分字母区间
我们首先需要知道每个字符的最右侧位置(即最后一次出现的位置),这样在遍历时就能判断一个区间内的所有字符是否都已经包含完整。由于题目中限定字符串由小写字母组成,因此可以直接使用一个大小为 26 的整型数组。,说明当前区间中的所有字符都不会再在后续出现了,此时可以安全地进行一次划分,并将该区间长度。在一次遍历中,我们将每个字符的最新索引位置记录下来。,也就是说当前区间至少要覆盖这个字符的最远位置。为了解决“每个字母最多只出现在一个区间中”的问题,采用的是。在第二轮遍历中,我们从左到右扫描字符串。
2025-06-01 10:56:40
291
原创 【Hot 100】45. 跳跃游戏 II
遍历nums数组,并且记录当前位置可以跳跃到的地方的最小步数,通过遍历 nums[i] 的值来更新每个位置的步数,并且需要记录最小步数。其实可以有一个优化技巧,就是记录minSteps数组此时更新到的最右侧边界索引。虽然跳跃是“在到达边界 end 的时候触发”,但能跳多远,取决于之前所有点探索的最远跳跃距离 farthest;在每一次跳跃时,总是选择当前跳跃范围内能跳最远的位置,作为下一次跳跃的边界,以此保证跳跃次数最少。换句话说:你起跳的位置未必是边界点本身,而是边界范围内跳得最远的那个位置。
2025-06-01 10:06:37
586
原创 【Hot 100】55. 跳跃游戏
遍历数组,并维护一个最大能到达的位置索引,并且在遍历的时候需要判断当前位置是否可达。如果不可达则直接返回 false。
2025-05-31 20:51:18
603
原创 【Hot 100】121. 买卖股票的最佳时机
不能是先遍历计算历史的最低价格,因为卖出需要在买入之前进行。所以遍历的时候不断更新当前股票最小价格就行,右侧的最小价格,不会影响左侧股票卖出赚到的利润。只需要遍历一次,而且是在第一次遍历就记录当前最小的股票价格,然后再计算卖出当前股票能赚到的利润,并更新最大利润。下面的解法,其实就是将dp进行状态压缩了,不需要维护一个完整的dp数组,只需要维护两个变量就行。今天开始贪心算法篇章,前一个星期有些事情耽搁了,今天继续。
2025-05-31 20:11:46
201
原创 【Hot 100】347. 前 K 个高频元素
当 k 远小于元素种类 m 时,此方案效率显著优于全排序方案。例如当 m=10000,k=10 时,时间复杂度由 O(m log m) 优化为 O(m log k)。代码思路正确,但在效率上有优化空间。这道题借用了很多stl的容器和算法,然后实现的。
2025-05-24 07:00:00
380
原创 【Hot 100】739. 每日温度
维护过程如下:如果当前元素小于栈顶元素,则直接入栈,不进行操作。如果当前元素大于栈顶元素,则需要将栈顶元素弹出,并记录比栈顶元素第一个大的元素下标。直到栈中没有小于当前元素的值或者栈为空。在单调栈基础题中,经常需要类似这种的解题思路:在 O(n) 的时间复杂度内求出数组中各个元素右侧第一个更大的元素及其下标,然后一并得到其他信息。非递增的栈,也就表示当前栈内的元素都没有遇到比自己大的元素值,如果遇到了,则需要将自己弹出并记录第一个大的元素的位置等信息。
2025-05-23 07:00:00
250
原创 【Hot 100】215. 数组中的第K个最大元素 堆的相关概念
比较项三段式划分两段式划分(原地 partition)空间复杂度$O(n)$(使用3个临时数组)$O(1)$ 原地操作实现复杂度简单清晰,逻辑更直观更接近标准快排、效率更高工程实用性教学友好,适合理解 quick select实战常用(如 LeetCode 高频解法)
2025-05-23 07:00:00
1516
原创 【Hot 100】155. 最小栈
所以本道题目的关键是利用栈先进后出的特性,并且再利用一个额外的栈空间单独存储最小值。也就是一个栈存储实际的数据,一个栈用于存储对应位置处的最小值。小顶堆可以在常数时间复杂度检索到最小元素,因为其堆顶元素就是最小元素。但是出栈入栈的逻辑就无法实现了。设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
2025-05-22 07:00:00
231
原创 【Hot 100】394. 字符串解码
通过栈的层级保存机制,每次遇到内层括号时将当前状态冻结,优先处理内层任务。内层处理完毕后,通过弹出的栈元素恢复外层状态继续处理,天然支持无限嵌套结构。),我们需要一种能保存当前处理状态,遇到内层括号时暂停当前任务,处理完内层后能恢复现场继续处理的结构。本题难点在于括号内嵌套括号,需要从内向外生成与拼接字符串,这与栈的先入后出特性对应。时,将当前字符串和数字压栈后重置,开始处理内层结构。由于字符串可能包含多层嵌套的括号结构(如。),确保能正确解析多位数。处理连续多位数字(如。
2025-05-22 07:00:00
857
原创 【Hot 100】4. 寻找两个正序数组的中位数
还有一种办法,用分别用一个指针指向两个数组的开头,并记录移动的总次数,每次比较这两个指针的值,移动小的数据,此方法的时间复杂度为 O(m+n) 还是没有达到很小,但是比刚才的暴力方法更好了一点。这道题目很像吉比特面试的时候面试官和我讨论的题目,是针对于中位数的深入理解,以及解题技巧。使用stl自带的二分搜索函数库,来实现这道题目,但是时间复杂度不满足要求。复杂度更低的代码思路,可以直接去看官方的。
2025-05-21 07:00:00
206
原创 【Hot 100】20. 有效的括号
遍历到左括号时直接入栈就行,遍历到右括号时要判断栈顶元素是否是对应的左括号,如果是的话就可以消除(换句话就是出栈)。元素压入栈,这在某些情况下会导致不必要的处理,尤其是当字符串的第一个字符就是右括号时,可以直接返回。可以通过使用一个映射表来简化左右括号的匹配判断,从而避免重复代码。语句中将右括号再次压栈,这不必要且会导致栈中的元素不对,应该改成在判断不匹配时返回。这个版本的代码更加简洁、可读性更强,同时避免了冗余的判断和操作。,而不是将不匹配的右括号压入栈。在你的代码中,遇到右括号时会在。
2025-05-21 07:00:00
442
原创 【Hot 100】33. 搜索旋转排序数组
↑旋转点(最小值1的下标)原本的,把前4个[1,2,3,4]挪到了数组后面。这个最小值(也就是原来数组的起点)的位置,我们就称为旋转点。你这种方式(找旋转点 + 标准库查找✅ 逻辑清晰;✅ 代码简洁(比手写二分更干净);✅ 利用了 STL 的优势。
2025-05-20 07:00:00
912
原创 【Hot 100】153. 寻找旋转排序数组中的最小值
的特殊情况,因为在整数的除法是向下取整的,所以mid只可能等于left(这道题目的前提是nums中的数字都唯一)。旋转后的数组其实就是两个升序数组,也可能就一个,因为旋转n次又回来了。的比较也能确定最小值的区间,但在旋转排序数组中,比较。让我更详细地解释为什么这样做更合适。,你也能确定最小值的位置。的特殊情况,因此更加高效和简单。这一道题目和上一道题目是一样的。时,不好进一步缩小区间。
2025-05-20 07:00:00
487
原创 【Hot 100】二分查找(单个目标值:查找目标值、多个目标值:查找目标值左右边界)
理解这一点之后,就能灵活地写出找左边界、右边界,甚至是插入位置的各种代码了。
2025-05-19 07:00:00
1450
原创 【Hot 100】34. 在排序数组中查找元素的第一个和最后一个位置
关于二分查找判断条件修改,可以定位目标值左右边界的讲解,在【Hot 100】二分查找(单个目标值:查找目标值、多个目标值:查找目标值左右边界)文章中有详细的说明。可以参考那篇文章。
2025-05-19 07:00:00
270
原创 【Hot 100】35. 搜索插入位置
项目你当前代码建议优化二分模板合理但有冗余判断使用标准左边界模板mid作用循环外使用,容易出错循环结束后直接返回left更稳妥可读性已经不错可加注释说明插入逻辑。
2025-05-18 07:00:00
483
原创 【Hot 100】74. 搜索二维矩阵
点表现思路清晰两段二分逻辑拆得很干净边界判断严谨能判断防止越界变量命名明确逻辑自洽,可读性强能通过所有测试完全符合 LeetCode 要求...// left - 1 就是目标行这段虽然正确,但可以写得更直观一些,比如直接写成找最后一个 ≤ target 的行,让语义更明确。不过保留你原写法也没问题,因为你注释写得清楚,不影响理解。方面你的写法优化建议正确性✅ 完美✅ 一样正确可读性✅ 强(注释清晰)⬆️ 可略简化性能✅ 可合并为 O(log mn)工程推荐✅ 很推荐。
2025-05-18 07:00:00
825
原创 【Hot 100】131. 分割回文串
回溯函数:每一层都有一个起始索引 index,然后从 index 开始遍历到字符串末尾。使用 substr 来获取子串。中直接用索引比较(你已经在主函数里实现了这一点)——如果你做了回文预处理,这一问题就自然消除了。,每次调用都会复制字符串,虽然现代编译器会优化,但可以进一步改成。是否为回文,例如在 “aabaa” 中,我们可以在主函数中预处理一个二维数组。辅助函数:判断是否是回文串。
2025-05-17 07:00:00
940
原创 【Hot 100】51. N 皇后
首先要找出有效的放置位置。如果一个皇后的位置在 [i, j] 处,那么 行和列等于 i 或 j 的位置都不行,同时 由于两条斜线位置也不能摆放,所以又要满足两个条件:(1)行下标与列下标之差相等(2)行下标与列下标之和相等。可以参考官方的优化代码。
2025-05-17 07:00:00
357
原创 【Hot 100】22. 括号生成
这一题就是要考虑清楚每一层决策树可以做出的选择和什么相关。该题每一层的决策与左括号和右括号的数量以及n有关。➡️ 这种做法用于极端性能优化场景,LeetCode 上一般不需要。,特别是在逻辑约束判断上做得很好,下面我将从四个方面分析你的代码。对括号),将当前路径加入结果集。,我们要从所有可能的括号排列中,这段代码非常扎实、结构清晰,是通过引用传递并手动回滚(来回操作,逻辑上更干净。
2025-05-16 07:00:00
739
原创 【Hot 100】79. 单词搜索
你准确抓住了题目的核心:从矩阵的每一个字符出发,尝试在四个方向上递归寻找下一个字符,直到组成目标字符串或回溯。枚举起点遍历board中每个格子,找到所有可能的起点(即字符等于word[0]的点)开始 DFS。DFS + 回溯搜索路径从当前点出发,向四个方向递归搜索,只要路径当前拼接的字符串等于word,立即返回true。剪枝条件越界判断;已访问判断(用visited标记);当前字符是否匹配下一个目标字符。回溯操作添加字符 → 递归 → 回溯(撤销字符 + 撤销访问状态)。项目评价。
2025-05-16 07:00:00
826
原创 【Hot 100】17. 电话号码的字母组合
本题就是将号码替换成字母的排列。每一个数字对应一个字符串,然后决策树的每一层就是遍历这个字符串。当前层遍历该数字对应的所有字母,每选一个字母就递归进入下一层。递归回来后撤销选择(➡️ 优点:更直观、可拓展,但略微降低性能(LeetCode 上完全够用)。每一个数字对应一组字母(最多 4 个),因此整棵树的。,说明已经构造出了一个完整的字母组合,加入结果集。由于每次递归都固定向下一位推进,可以直接用。,每层根据当前数字遍历其对应的所有字母。➡️ 优点:代码更紧凑,少传一个变量。
2025-05-15 07:00:00
836
原创 【Hot 100】39. 组合总和
优点说明✅ 回溯逻辑正确处理了重复元素、组合去重✅ 使用sum提前剪枝减少递归深度✅ 变量命名清晰sumpathstartIndex表意准确✅ 使用引用传参提升性能,避免拷贝。
2025-05-15 07:00:00
685
原创 【Hot 100】46. 全排列,以及回溯算法
回溯算法是解决组合、排列、子集、棋盘类问题的利器,通过递归和剪枝平衡穷举与效率。掌握其模板和适用场景后,可灵活应对大多数暴力搜索问题。
2025-05-14 07:00:00
1318
原创 【Hot 100】78. 子集
和上一道全排列的题目有异曲同工之处,都是使用回溯。只不过这个子集,每一层要采用一个起始索引来标识遍历的范围。的,主要取决于你是否想显式表达“到头了就返回”。
2025-05-14 07:00:00
415
原创 【Hot 100】208. 实现 Trie (前缀树)
代码逻辑正确,但存在内存泄漏问题。建议通过析构函数或智能指针优化内存管理。其他优化可根据实际需求选择。// 智能指针数组public:if (!if (!if (!
2025-05-13 10:34:37
766
原创 【学习路线】 游戏客户端开发入门到进阶
游戏开发是一个交叉性极强的技术领域,对开发者提出了高维度的要求。作为初学者,不要急于求成,打牢基础、注重原理、勤于实践,你的成长将会非常快速而稳健。希望这份学习路线与书单能为你指明方向,迈出职业开发者的第一步。
2025-05-13 10:00:17
980
原创 【Hot 100】198. 打家劫舍
分别记录前前一个和当前的最大金额。每次遍历到一个新房屋时,计算偷或不偷该房屋的较大值,并更新这两个变量。这样既保证了时间复杂度为 O(n),空间复杂度为 O(1)。这道题是一个典型的dp问题。也就是说后面的状态可以由前面的状态递归而来。首先回顾一下题目的要求,求解小偷沿屋偷窃完之后最大能盗取的金额。主要是优化了代码空间,因为当前状态主要由前两个状态决定,所以只需要两个变量来记录前两个状态即可。今天做题跳跃一点,开始动态规划专题。使用动态规划,通过两个变量。
2025-05-12 07:00:00
1264
原创 【Hot 100】994. 腐烂的橘子
用 BFS 如果需要最短路径、分层处理、状态空间步数最小化。问题类似“扩散”、“最少步数”、“层序遍历”。用 DFS 如果需要递归/回溯、遍历所有解、连通性分析。问题类似“所有可能”、“连通区域”、“排列组合”。灵活结合:某些问题可以同时用 BFS 和 DFS(如“岛屿数量”),但要根据问题特点选择更优解。
2025-05-11 07:00:00
673
原创 【Hot 100】207. 课程表
理解图的基本概念(有向/无向图、入度/出度)和存储方式(邻接表/矩阵)是掌握拓扑排序的基础。BFS和DFS方法分别通过入度管理和路径检测来解决环的存在性问题,两种方法均高效且易于实现。实际应用中,邻接表+BFS的组合在大多数场景下更为常见。
2025-05-11 07:00:00
978
原创 【笔试】 网易雷火校园招聘笔试编程题类型
动态规划:编辑距离、打家劫舍、最长回文子串等经典问题(需掌握状态转移方程优化)。字符串处理:加密解密、模式匹配、复杂模拟题(如文本编辑器)。图论与搜索:BFS/DFS在路径问题或状态模拟中的应用。数学与数论:质因数分解、欧拉函数、数位DP(如最小F(x)=φ(x)/x问题)。
2025-05-10 07:00:00
1677
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人