- 博客(54)
- 收藏
- 关注
原创 代码随想录Day62|总结篇
一路练习过来并不容易,从开营之日起,几乎每天都有各种各样的事情导致练习推迟,经常很晚才开始当天的练习,甚至一次补好几天的任务。好在,最后坚持了下来,在截止前顺利完成了所有章节的任务,学思想、写代码、写博客,每次的任务都不落下。任务的难度不一,但确实越来越熟练了,从一开始的每天4h到现在的一个任务1h以内完成,能看到在一点点进步。起初对于C++的应用也不是很熟练,很多方法和数据结构压根没有使用过,也是代码随想录带着我一点一点的学习常用的数据结构和方法的用法,现在怎么说也算是入门了。
2025-10-25 22:35:47
262
原创 代码随想录Day61|Floyd 算法精讲、A * 算法精讲
本文介绍了两种图论算法:Floyd算法和A算法的实现与应用。Floyd算法通过动态规划求解多源最短路径,包含两种解法:三维数组存储和空间优化二维数组版本,时间复杂度均为O(n³)。A算法是一种启发式搜索算法,结合广度优先搜索和优先队列,使用欧拉距离作为启发函数求解最短路径。两种算法分别适用于不同场景:Floyd适用于全源最短路径,A*更擅长单源路径搜索。文章通过具体代码实现展示了算法的核心思路和优化技巧,并分析了时间与空间复杂度。
2025-10-25 22:11:19
321
原创 代码随想录Day60|Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路、bellman_ford之单源有限最短路
本文介绍了Bellman-Ford算法的优化版本SPFA及其应用。SPFA通过队列优化,仅对上次计算后距离改变的点进行松弛操作,时间复杂度为O(mn)。文章还讲解了如何利用Bellman-Ford算法判断负权回路,以及处理单源有限最短路问题。后者通过缓存上一轮距离数组确保不重复走节点,时间复杂度为O(km)。两种解法分别适用于不同场景,提供了解决最短路径问题的有效方法。
2025-10-25 17:58:21
633
原创 代码随想录Day59|dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
本文讲解了两种经典的最短路径算法:Dijkstra堆优化版和Bellman-Ford算法。Dijkstra算法通过优先队列优化,从起点出发逐步更新邻接点距离,适用于稀疏图,时间复杂度为O(mlogm)。Bellman-Ford算法通过n-1次松弛所有边来求解最短路径,能处理负权边,时间复杂度为O(nm)。两种算法各有适用场景,前者效率更高但无法处理负权,后者更通用但效率较低。文章提供了两种算法的C++实现代码和详细分析。
2025-10-25 16:12:47
632
原创 代码随想录Day58|拓扑排序精讲、dijkstra(朴素版)精讲
本文介绍了两种图论算法:拓扑排序和Dijkstra算法。拓扑排序通过广度优先搜索处理入度为0的节点,判断任务依赖关系是否存在环路;时间复杂度O(nk),空间复杂度O(nk)。Dijkstra算法采用贪心策略计算单源最短路径,适用于无负权边的情况;时间复杂度O(n²),空间复杂度O(n²)。两种算法均通过队列或数组实现核心逻辑,最后根据结果集大小判断解的有效性。
2025-10-25 14:55:02
561
原创 代码随想录Day57|prim算法、kruskal算法
本文介绍了两种最小生成树算法:Prim和Kruskal。Prim算法通过逐步选择距离当前生成树最近的节点来构建树,时间复杂度O(n²);Kruskal算法则通过对边排序并检查环路来构建树,使用并查集优化,时间复杂度O(nlogn)。两种算法都基于贪心思想,Prim侧重节点操作,Kruskal侧重边操作。代码实现展示了两种算法的核心逻辑,适用于不同场景的最小生成树问题。
2025-10-25 11:07:25
751
原创 代码随想录Day55|108. 冗余连接、109. 冗余连接II
本文讲解了两道关于冗余连接的算法题。第一题通过并查集检测无向图中形成环的边,输出最先导致环的边。第二题处理有向图中的冗余边,分为入度为2和成环两种情况,使用并查集判断需要删除的边。两题均采用并查集实现,时间复杂度O(n),空间复杂度O(n)。总结指出这些题目考察了图论中的环检测和并查集应用能力。
2025-10-22 22:35:18
236
原创 代码随想录Day54|并查集理论基础、107. 寻找存在的路径
摘要:本文介绍了并查集理论基础及其在路径查找问题中的应用。通过初始化、查找、合并等操作,判断两个节点是否连通。以107题为例,展示如何用并查集判断两点间是否存在路径,时间复杂度O(n),空间复杂度O(logn)。代码实现简洁,直接套用模板即可解决问题。
2025-10-21 21:58:03
306
原创 代码随想录Day53|110. 字符串接龙、105.有向图的完全联通、106. 岛屿的周长
摘要 本文介绍了三个图论与搜索算法题目的解法。 字符串接龙:通过BFS搜索最短转换路径,使用队列记录状态和路径长度,集合避免重复访问,时间复杂度O(n)。 有向图完全联通:使用DFS检查图的连通性,若所有节点可达则输出1,否则输出-1,时间复杂度O(n²)。 岛屿周长:遍历每个陆地单元,计算其相邻陆地数,4减去相邻数即为该单元的周长贡献,总时间复杂度O(nm)。 三个题目分别展示了BFS、DFS和遍历的应用,涉及图论的基本操作和优化思路。
2025-10-21 20:28:54
258
原创 代码随想录Day52|101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿
摘要 这两道题目均采用深度优先搜索(DFS)算法解决岛屿相关问题。101题通过两次DFS,先消除边界连接的岛屿,再统计剩余孤岛面积。102题同样使用两次DFS,先标记非孤岛区域,再将孤岛沉没。103题采用逆向思维,从边界出发标记可达区域。所有解法的时间复杂度均为O(mn),空间复杂度O(mn),适用于矩阵遍历类问题。解题关键在于合理设计DFS遍历顺序和标记策略,区分目标区域与非目标区域。
2025-10-21 18:42:40
1019
原创 代码随想录Day51|99.岛屿数量 深搜、99.岛屿数量 广搜、100.岛屿的最大面积
本文介绍了两种解决岛屿数量问题的算法:深度优先搜索(DFS)和广度优先搜索(BFS),以及计算岛屿最大面积的变体。DFS和BFS均通过遍历矩阵,标记已访问的陆地来统计岛屿数量,时间复杂度均为O(mn),空间复杂度为O(mn)。计算岛屿最大面积时,只需在搜索过程中累加面积并比较最大值。两种算法思想相似,适用于网格类问题的遍历与统计。
2025-10-17 00:48:14
1002
原创 代码随想录Day50|深度优先搜索、98. 所有可达路径、广度优先搜索
本文介绍了图论中的深度优先搜索(DFS)和广度优先搜索(BFS)算法。重点通过"所有可达路径"问题展示了DFS的实现方法,包括邻接矩阵和邻接表两种解法。DFS的核心是回溯思想,通过递归遍历所有可能路径。两种解法的时间复杂度均为O(nm),但邻接表版本的空间复杂度更优。文章还提供了相关学习资源和代码实现,帮助理解图论基础算法在实际问题中的应用。
2025-10-13 19:43:56
820
原创 代码随想录Day48|42. 接雨水、84.柱状图中最大的矩形
本文介绍了LeetCode中两道经典单调栈问题(42.接雨水和84.柱状图中最大矩形)的解题思路。通过双指针和单调栈两种解法,分别优化了暴力解法的时间复杂度。接雨水问题通过计算每列左右最大高度差求解,而柱状图问题则通过寻找左右第一个较小值来确定矩形边界。两种解法时间复杂度均为O(n),空间复杂度O(n)。文章强调需要加强单调栈的熟练度,建议通过反复练习掌握这类问题的解题技巧。
2025-10-11 19:16:17
904
原创 代码随想录Day47|739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II
本文介绍了LeetCode中关于单调栈的三道题目解法。739题使用单调栈找到每日温度后第一个更高温度的天数,时间复杂度O(n)。496题通过哈希表优化查找过程,解决nums1元素在nums2中找下一个更大元素的问题。503题处理环形数组时,通过拼接数组或取模运算实现循环查找。单调栈能有效优化需要寻找相邻元素关系的场景,将暴力解法的时间复杂度从O(n^2)降至O(n)。文章提供了多种实现方式,并分析了时间空间复杂度,展示了单调栈在算法优化中的灵活应用。
2025-10-10 22:41:55
271
原创 代码随想录Day46|647. 回文子串、516.最长回文子序列
本文介绍了回文子串相关的两道算法题解法。647题通过动态规划或双指针法统计所有回文子串,时间复杂度O(n²)。516题使用动态规划求解最长回文子序列,当字符相同时更新长度,不同时比较子区间结果。两题都采用二维dp数组,从下往上、从左往右遍历。动态规划是解决回文问题的有效方法,通过状态转移高效求解区间问题。
2025-10-10 20:27:33
253
原创 代码随想录Day45|115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
本文总结了LeetCode中三道字符串动态规划问题的解法:115.不同的子序列、583.两个字符串的删除操作和72.编辑距离。115题通过二维DP统计t在s中出现的非连续子序列数;583题通过DP计算使两字符串相同的最小删除步数;72题则扩展为包含增删改操作的最小编辑距离。三题均采用二维DP数组,时间复杂度O(mn),空间复杂度O(mn),展现了动态规划在字符串处理中的典型应用。
2025-10-10 19:39:23
490
原创 代码随想录Day44|1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列
这篇文章主要讲解了4道动态规划相关的算法题: 1143.最长公共子序列:使用二维DP数组,当字符匹配时累加长度,否则取前一步的最大值。时间复杂度O(mn),空间复杂度O(mn)。 1035.不相交的线:本质与最长公共子序列相同,保持相对顺序即可。采用相同的DP解法。 53.最大子序和:用一维DP数组记录以当前元素结尾的最大和,时间复杂度O(n)。 392.判断子序列:类似公共子序列问题,但当字符不匹配时只能删除主串中的字符。 所有题目都采用动态规划思路,通过状态转移方程逐步求解。
2025-10-09 20:12:23
914
原创 代码随想录Day43|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
本文总结了最长递增子序列问题的三种变体及其解法: 最长递增子序列(LIS):采用动态规划,时间复杂度O(n²),需遍历比较之前所有元素。 最长连续递增序列(LCIS):简化版LIS,只需比较前一个元素,时间复杂度O(n)。 最长重复子数组:使用二维动态规划或滚动数组优化,分别实现O(mn)和O(n)空间复杂度。 核心思想均是通过动态规划记录状态,并在遍历中更新最大值。
2025-10-09 15:37:56
268
原创 代码随想录Day42|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费
本文总结了LeetCode上几道股票买卖问题的动态规划解法。对于188题,通过滚动数组优化空间复杂度至O(k),将买卖状态用奇偶下标区分;309题引入冷冻期,通过四种状态(持有、卖出当天、冷冻期、非冷冻期)的转换关系求解;714题则在常规买卖模型基础上增加了手续费处理。这些题目展示了如何通过状态机思想处理不同交易约束条件,时间复杂度均为O(n),空间复杂度通过优化可达O(1)。各解法均体现了动态规划在股票问题中的灵活应用,特别是状态定义和转移方程的设计技巧。
2025-09-30 18:22:06
949
原创 代码随想录Day41|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III
本文总结了LeetCode上三道股票买卖问题的动态规划解法。121题限制单次交易,通过维护持有/未持有两种状态求解;122题允许多次交易,递推时考虑累计收益;123题限制最多两次交易,扩展为四种状态(第一次持有/卖出、第二次持有/卖出)。三道题均采用滚动数组优化空间至O(1),时间复杂度保持O(n)。核心在于将交易限制转化为状态转移方程的设计。
2025-09-29 19:16:25
858
原创 代码随想录Day39|198.打家劫舍、213.打家劫舍II、337.打家劫舍III
本文总结了LeetCode上打家劫舍系列题目的解法。198题使用动态规划,递推公式为dp[i] = max(dp[i-2]+nums[i], dp[i-1])。213题将环形问题拆分为两种情况处理。337题采用后序遍历处理树形结构,记录偷与不偷当前节点的最大值。三题均通过动态规划思想解决,时间复杂度为O(n)或O(logn),是动态规划在偷窃问题中的典型应用。
2025-09-27 09:48:07
576
原创 代码随想录Day38|322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包
本文总结了完全背包和多重背包问题的解题思路与代码实现。针对零钱兑换问题,采用动态规划求解最小硬币数量,解法时间复杂度O(mn)。对于完全平方数问题,两种解法分别从构建平方数数组和直接处理平方数入手。单词拆分问题通过动态规划和集合优化提升效率。多重背包问题则在01背包基础上遍历物品个数。整体把握背包问题的核心思想,通过状态转移方程求解最优解。
2025-09-26 19:25:11
736
原创 代码随想录Day37|完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、57. 爬楼梯
本文总结了完全背包问题的解题思路和代码实现。完全背包与01背包的区别在于物品可重复使用,解法上采用正序遍历的滚动数组方式。文章通过KamaCoder和LeetCode例题,展示了完全背包的不同应用场景:零钱兑换问题(组合数)、组合总和问题(排列数)和爬楼梯问题(排列数)。关键点在于遍历顺序的选择:求组合数时先遍历物品,求排列数时先遍历背包容量。所有解法的时间复杂度均为O(nv),空间复杂度优化至O(v)。
2025-09-25 19:41:05
937
原创 代码随想录Day36|1049. 最后一块石头的重量 II、494. 目标和、474.一和零
本文总结了LeetCode中三道01背包问题的变种解法。1049题将石头分成重量最接近的两堆,转化为背包问题;494题通过数学推导将目标和问题转化为求特定和的组合数;474题则处理二维容量的背包问题。三题均使用动态规划,其中前两题采用滚动数组优化空间。解题关键在于将问题转化为背包模型,并正确设计状态转移方程。时间复杂度在O(n²)到O(mnl)之间,空间复杂度优化至O(n)或O(mn)。
2025-09-24 16:14:11
628
原创 代码随想录Day35|01背包问题、416. 分割等和子集
本文介绍了01背包问题的两种解法(二维和一维数组)及其应用。01背包问题核心在于动态规划,通过递推公式计算不同物品和背包容量组合下的最大价值。二维解法通过二维数组记录状态,空间复杂度较高;一维解法优化空间复杂度,使用滚动数组并逆序遍历避免重复计算。最后以LeetCode 416题为例,将分割等和子集问题转化为01背包问题,验证了算法的实用性。两种解法时间复杂度均为O(mn),但一维解法空间复杂度优化至O(n)。
2025-09-23 18:23:59
983
原创 代码随想录Day34|62.不同路径、63. 不同路径 II、343. 整数拆分、96.不同的二叉搜索树
本文介绍了动态规划解决不同路径问题的思路与代码实现。对于62题,使用二维数组和一维数组两种解法,通过递推公式dp[i][j]=dp[i-1][j]+dp[i][j-1]计算到达终点的路径数。63题在62题基础上增加了障碍物条件,需要额外判断障碍物位置。343题通过拆分为j*(i-j)和j*dp[i-j]来寻找整数拆分的最大乘积。96题则通过遍历节点作为根节点的情况,计算不同二叉搜索树的数量。所有解法的时间复杂度均为O(n^2),空间复杂度优化为O(n)。
2025-09-22 20:20:31
912
原创 代码随想录Day32| 509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
本文总结了LeetCode上三道动态规划题目:斐波那契数列、爬楼梯和最小花费爬楼梯。这三题均采用动态规划思想,通过定义dp数组、递推公式、初始条件和遍历顺序求解。斐波那契数列和爬楼梯问题本质相同,递推公式为dp[i]=dp[i-1]+dp[i-2],可优化为O(1)空间。最小花费爬楼梯问题在递推时需比较前两层的花费总和,取较小值。通过这三题可以掌握动态规划的基本解题流程和应用场景。
2025-09-20 19:07:35
842
原创 代码随想录Day31|56. 合并区间、738.单调递增的数字、968.监控二叉树
摘要: 本文整理了LeetCode三道区间和数字处理问题的贪心解法。56.合并区间通过排序后更新重叠区间参数;738.单调递增数字采用从右至左遍历,将不满足条件的位减一并后续置9;968.监控二叉树通过后序遍历标记节点状态(0未覆盖/1有摄像头/2已覆盖),自底向上统计摄像头数量。三题均体现贪心算法的局部最优思想,时间复杂度O(nlogn)至O(n)。总结指出贪心策略灵活多变,需根据问题特点设计局部最优解。
2025-09-19 19:02:11
671
原创 代码随想录Day30|452. 用最少数量的箭引爆气球、435. 无重叠区间、 763.划分字母区间
本文总结了452、435、763三道区间重叠问题的解法。452题通过排序后比较右边界来最小化射箭次数;435题同样通过排序和比较右边界来删除最少重叠区间;763题则采用最远边界法或区间重叠法划分字母区间。核心思路都是利用贪心算法,通过排序和边界处理来优化区间选择。时间复杂度多为O(nlogn),空间复杂度为O(n)。这类问题展现了贪心算法在区间处理中的高效应用。
2025-09-18 15:19:08
989
原创 代码随想录Day29|134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列
文章摘要 134. 加油站 两种贪心解法:1) 全局最优法,通过寻找油量最小值确定起点;2) 局部最优法,若当前区间和小于0则更新起点。时间复杂度均为O(n)。 135. 分发糖果 贪心策略:先从左到右确保右孩子评分高时糖果更多,再从右到左处理左孩子情况,保证总糖果数最少。时间复杂度O(n),空间O(n)。 860. 柠檬水找零 模拟找零过程,优先用大面额找零(贪心思想)。收到20美元时优先用10+5组合。时间复杂度O(n),空间O(1)。 406. 根据身高重建队列 先按身高降序排列,相同身高按k升序,再
2025-09-17 21:18:05
940
原创 代码随想录Day28|122.买卖股票的最佳时机II、55. 跳跃游戏、45.跳跃游戏II、1005.K次取反后最大化的数组和
本文总结了LeetCode上四道贪心算法相关的题目解法。122题通过比较相邻天数的股票价格差,使用贪心或动态规划计算最大收益;55题和45题分别用贪心思想判断能否跳跃到终点及最小跳跃次数;1005题则通过模拟K次取反操作获得最大数组和。各解法均达到O(n)时间复杂度,空间复杂度多为O(1)。
2025-09-16 21:28:35
923
原创 代码随想录Day27|455.分发饼干、376. 摆动序列、53. 最大子序和
本文总结了三个贪心算法题目的解法: 分发饼干:通过排序后匹配最小饼干与最小胃口或最大饼干与最大胃口,两种解法时间复杂度均为O(nlogn)。 摆动序列:利用贪心思想记录差值变化,时间复杂度O(n);动态规划解法复杂度O(n²)。 最大子序和:贪心策略在连续和小于零时重置,动态规划通过状态转移求解,时间复杂度均为O(n)。 总结:贪心算法通过局部最优解实现全局最优,部分题目可与动态规划相互补充。
2025-09-15 19:42:22
608
原创 代码随想录Day25|491.递增子序列、46.全排列、47.全排列 II、51.N皇后、37.解数独
今天的题目主要还是回溯的应用,后面几道题难度较大,对于回溯的应用比较灵活。没想到回溯模块不到一周就结束了()
2025-09-13 21:27:13
1061
原创 代码随想录Day24|93.复原IP地址、78.子集、90.子集II
本文总结了LeetCode上三道回溯算法的题目:93.复原IP地址、78.子集和90.子集II。复原IP地址通过回溯截取字符串片段并验证合法性,子集问题则直接收集所有可能组合,而子集II在原问题基础上增加了去重处理。三题均采用回溯框架,时间复杂度在O(2^n)到O(3^4)之间。通过排序和剪枝优化,能有效处理重复元素问题。这些题目展示了回溯算法在组合分割类问题中的通用解法,通过逐步完善条件判断和剪枝策略即可解决变种问题。
2025-09-12 22:40:32
594
原创 代码随想录Day23|39. 组合总和、40.组合总和II、131.分割回文串
文章摘要: 本文介绍了LeetCode上组合总和问题的两种解法,包括允许重复元素的39题和不允许重复元素的40题。解法1通过回溯模板实现,但存在集合重复问题,通过跳过较小元素优化;解法2通过传递下标参数减少开销。131题要求分割回文串,采用双指针判断回文并通过回溯在字符串间划割线。所有解法均包含时间复杂度分析,核心思路是通过回溯框架结合剪枝优化解决问题。 (99字)
2025-09-11 15:28:05
814
原创 代码随想录Day20|235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
今天的最后一题确实很容易弄错,值得反复学习。
2025-09-09 00:38:25
878
原创 代码随想录Day18|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先
打数模去了,补打卡()。最后一题没见过的话理解起来需要花一些时间,后续需要重新复习。
2025-09-08 01:31:08
397
原创 代码随想录Day17|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
打数模去了,补打卡()。不得不说,今天的题目尤其是最后一个还是值得细细品味细节的。
2025-09-07 18:31:20
1077
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅