自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法中DFS & BFS 核心学习笔记

本文系统对比了DFS与BFS两种图搜索算法:BFS采用队列逐层扩展("水波纹扩散"),适合最短路径问题;DFS采用栈或递归深度优先("一条路走到黑"),擅长环检测和回溯问题。文章从核心思想、空间复杂度、应用场景、代码模板等多维度对比,并给出决策树和记忆口诀。关键差异在于BFS保证最短路径但空间消耗大,DFS空间高效但不保证路径最优。选择依据是问题需求(求最短用BFS,查环用DFS)和空间限制(宽图用DFS,深图用BFS)。

2025-12-22 11:19:20 348

原创 算法17. 电话号码的字母组合

本文介绍了如何解决电话号码字母组合问题。给定一个数字字符串,返回其对应电话按键上的所有字母组合。通过回溯算法实现:1) 建立数字到字母的映射表;2) 使用深度优先搜索遍历所有可能组合;3) 当路径长度等于数字长度时保存结果。时间复杂度为O(3^N * 4^M),空间复杂度为O(N)。适用于长度1-4的数字输入,能有效生成所有字母组合。

2025-12-16 10:11:26 143

原创 如何理解python中异步函数的await?既然是异步,不阻塞,为什么还叫作“等待”

await 并非阻塞等待,而是挂起当前协程并让出控制权给事件循环,使其能调度其他任务。它等待的是可等待对象(如协程、Task)的结果,而非直接执行函数。当遇到I/O操作时,事件循环会切换执行其他就绪任务,待操作完成后再恢复原协程。这种机制实现了单线程下的高效并发,与同步阻塞等待有本质区别。关键点在于:1) await触发异步操作执行;2) 等待期间允许任务切换;3) 仅适用于原生异步I/O操作。

2025-12-03 16:32:48 459

原创 算法55. 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。判断你是否能够到达最后一个下标,如果可以,返回 true;否则,返回 false。输入:nums = [2,3,1,1,4]输入:nums = [3,2,1,0,4]

2025-11-28 10:35:18 286

原创 算法347.前 K 个高频元素

本文介绍了一种解决"返回数组中出现频率前k高元素"问题的方法。该方法采用桶排序思想,分为三个步骤:首先统计每个元素的出现频率;然后将相同频率的元素放入对应桶中;最后从最高频开始倒序遍历桶,直到收集到k个元素。这种方法时间复杂度为O(n),其中n为数组长度,适用于大数据量情况。示例表明该方法能正确找出前k个高频元素,如输入[1,1,1,2,2,3]和k=2时,输出为[1,2]。

2025-11-28 09:48:08 170

原创 算法33. 搜索旋转排序数组

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 向左旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …例如, [0,1,2,4,5,6,7] 下标 3 上向左旋转后可能变为 [4,5,6,7,0,1,2]。输入:nums = [4,5,6,7,0,1,2], target = 0。输入:nums = [4,5,6,7,0,1,2], target = 3。

2025-11-26 17:30:49 169

原创 算法34. 在排序数组中查找元素的第一个和最后一个位置

本文介绍了使用二分查找算法在有序数组中查找目标值的起始和结束位置。通过两次二分查找:第一次查找目标值首次出现的位置(左边界),第二次查找目标值最后出现的位置(右边界)。若目标值不存在,则返回[-1, -1]。该方法时间复杂度为O(log n),空间复杂度为O(1),满足题目要求。示例展示了对于输入数组[5,7,7,8,8,10],查找8返回[3,4],查找6返回[-1,-1]的情况。

2025-11-26 17:06:03 209

原创 算法74. 搜索二维矩阵

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13。输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3。给你一个整数 target ,如果 target 在矩阵中,返回 true;否则,返回 false。每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。

2025-11-26 16:36:25 193

原创 算法131. 分割回文串

摘要 本文介绍了如何将一个字符串分割为所有可能的回文子串组合。通过回溯算法,从字符串起始位置开始,枚举所有可能的子串结束位置。当子串是回文时,将其加入当前路径,并递归处理剩余字符串。当处理完整个字符串时,保存当前分割方案。最终返回所有可行的回文分割方案。该方法时间复杂度为O(n*2^n),适用于长度不超过16的字符串。

2025-11-25 18:02:19 426

原创 算法79. 单词搜索

本文解决二维字符网格中查找单词是否存在的问题。通过深度优先搜索(DFS)算法,从每个网格点出发,检查能否按顺序匹配单词的所有字符。算法首先统计字符频率进行剪枝优化,然后通过递归搜索相邻单元格,使用临时标记避免重复访问。若找到完整匹配路径则返回true,否则恢复网格状态继续搜索。该方法能有效处理相邻字符组合成单词的情况,确保每个单元格只使用一次。时间复杂度为O(mn*4^L),其中m、n为网格尺寸,L为单词长度。

2025-11-25 17:59:35 153

原创 算法22. 括号生成

输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

2025-11-25 17:42:54 165

原创 算法39. 组合总和

本文介绍了一种使用深度优先搜索(DFS)解决组合总和问题的算法。给定一个无重复元素的整数数组candidates和目标值target,算法通过递归回溯的方式,找出所有可以使数字和等于target的不同组合。每个数字可以无限次使用。算法从第一个候选数开始,每次决策选择或不选择当前数,并递归处理剩余目标值。当目标值减为0时记录有效组合,否则回溯尝试其他可能。该方法保证了找到所有满足条件的组合,时间复杂度取决于组合数量(保证少于150个)。

2025-11-25 17:22:56 132

原创 算法78. 子集

摘要 本文介绍了一种使用深度优先搜索(DFS)生成数组所有子集的算法。给定一个元素互不相同的整数数组,算法通过递归方式遍历每个元素,分别考虑包含或不包含该元素的情况,最终生成所有可能的子集组合。关键点在于每次递归调用后需要恢复现场,确保路径的正确性。该算法时间复杂度为O(2^n),空间复杂度为O(n),适用于长度不超过10的数组。

2025-11-25 16:22:30 216

原创 算法46. 全排列

摘要 本文介绍了使用深度优先搜索(DFS)算法生成数组全排列的解法。给定一个不含重复数字的数组,通过递归回溯的方式枚举所有可能的排列组合。算法维护一个路径数组记录当前排列,并使用标记数组避免重复使用数字。当路径长度等于输入数组长度时,将当前排列加入结果集。时间复杂度为O(n!),空间复杂度为O(n),适用于长度不超过6的输入数组。该方法能正确处理示例中的各种情况,包括单元素数组。

2025-11-25 15:00:11 339

原创 算法208. 实现 Trie (前缀树)

本文实现了一个前缀树(Trie)数据结构,用于高效存储和检索字符串。前缀树通过树形结构存储字符串,每个节点代表一个字符,路径表示字符串。主要功能包括: insert:插入字符串 search:精确查找字符串是否存在 startsWith:查找是否存在以指定前缀开头的字符串 实现采用字典存储子节点,通过find辅助方法统一处理查找逻辑。该方法返回2表示完全匹配,1表示前缀匹配,0表示不匹配。这种实现方式在自动补全、拼写检查等场景有广泛应用,时间复杂度为O(L)(L为字符串长度)。

2025-11-24 18:07:29 398

原创 算法236. 二叉树的最近公共祖先

摘要 本文介绍了如何在二叉树中找到两个节点的最近公共祖先(LCA)。通过递归方法,从根节点开始遍历,若当前节点等于p或q则直接返回;否则分别在左右子树中查找。当左右子树分别找到p和q时,当前节点即为LCA。时间复杂度为O(n),空间复杂度为O(h),其中h为树高。该方法简洁高效,适用于所有二叉树结构。

2025-11-24 16:19:21 1018

原创 Python “nonlocal“ 关键字笔记

nonlocal关键字用于在嵌套函数中修改外层函数的变量。当需要重新赋值不可变对象(如数字、字符串)或重新绑定可变对象(如列表、字典)时,必须使用nonlocal;而仅读取变量或修改可变对象内容时则不需要。关键区别在于是否使用赋值操作(=)。简单记忆:只有使用=赋值时才需要nonlocal。

2025-11-23 13:04:39 274

原创 算法15. 三数之和

本文介绍了如何找出数组中所有和为0且不重复的三元组。通过排序数组便于去重,然后使用双指针法将三数之和问题转化为两数之和问题。在遍历过程中,外层循环固定第一个数,内层双指针寻找另外两个数,同时通过跳过重复元素避免重复解,并利用剪枝优化减少不必要的计算。最终返回所有满足条件的三元组集合。算法时间复杂度为O(n²),空间复杂度为O(1)。

2025-11-18 16:11:26 289

原创 算法155. 最小栈

摘要 设计一个支持push、pop、top操作,并能在O(1)时间内获取最小值的栈MinStack。使用辅助栈存储当前最小值,每个元素入栈时记录当前栈的最小值。push操作比较新元素与当前最小值;pop直接删除栈顶;top返回栈顶元素值;getMin返回栈顶记录的最小值。该方案通过空间换时间,保证所有操作的时间复杂度均为O(1)。

2025-11-10 18:11:30 242

原创 算法394. 字符串解码

摘要:本文提出了一种递归解决字符串解码问题的方法。给定形如"k[encoded_string]"的编码字符串,需要将其解码为重复k次的字符串。算法通过递归处理字符串中的字母和数字:遇到字母时直接拼接;遇到数字时找到匹配的括号对,递归解码括号内内容并重复k次,再处理剩余部分。该方法有效处理了嵌套编码的情况,如"3[a2[c]]"解码为"accaccacc"。时间复杂度为O(n),其中n是输出字符串长度。

2025-11-10 18:04:54 202

原创 算法739. 每日温度

本文介绍了一种使用单调栈解决每日温度问题的算法。给定一个温度数组,要求返回每个温度之后第一个更高温度出现的天数差。算法采用从右向左遍历的方式,维护一个单调递减栈来存储温度索引。对于每个温度,弹出栈中所有小于等于当前温度的元素,栈顶即为第一个更高温度的索引,计算天数差存入结果数组。该方法时间复杂度为O(n),空间复杂度为O(n),能高效处理大规模数据。

2025-11-10 17:59:37 212

原创 算法215. 数组中的第K个最大元素

文章摘要:题目要求在未排序数组中找到第k大的元素。给出了两种解法:第一种直接排序后取倒数第k个元素,但时间复杂度为O(nlogn);第二种采用快速选择算法,基于快速排序思想,通过随机选择基准值将数组分为三部分,递归缩小查找范围,平均时间复杂度为O(n)。后者是更优解,符合题目要求的线性时间复杂度。

2025-11-10 17:55:58 286

原创 算法763. 划分字母区间

摘要: 题目要求将字符串划分为多个片段,每个字母只能出现在一个片段中。通过记录每个字母的最后出现位置,遍历字符串时动态更新当前片段的右边界。当遍历位置与右边界重合时,表示完成一个片段的划分,记录其长度并开始下一个片段。示例中"ababcbacadefegdehijhklij"被划分为[9,7,8]。该算法时间复杂度为O(n),空间复杂度为O(1)(仅需存储26个字母的最后位置)。

2025-11-07 15:54:53 254

原创 算法322. 零钱兑换

本文解决了一个经典的动态规划问题——硬币找零问题。使用递归方法配合记忆化搜索,计算凑成指定金额所需的最少硬币数。算法定义了一个深度优先搜索函数dfs(i,c),表示使用前i种硬币凑出金额c的最优解。通过比较选与不选当前硬币的情况,求出最小值。时间复杂度为O(n⋅amount),空间复杂度为O(n⋅amount),其中n为硬币种类数。若无法凑出目标金额则返回-1。

2025-11-06 16:26:13 312

原创 算法72. 编辑距离

摘要 本文解决字符串最小编辑距离问题,计算将word1转换为word2所需的最少操作次数(插入、删除或替换字符)。采用记忆化深度优先搜索(DFS)方法,递归比较字符,通过三种操作路径选择最小值。使用字典c缓存中间结果避免重复计算。算法时间复杂度为O(mn),适用于500字符以内的字符串转换。示例显示"horse"转"ros"需3步,"intention"转"execution"需5步。

2025-11-04 17:50:13 252

原创 算法5. 最长回文子串

这篇文章介绍了使用动态规划方法求解最长回文子串的算法。通过构建二维数组dp[i][j]记录子串s[i...j]是否为回文串,先初始化长度为1和2的子串情况,然后逐步扩展子串长度。当两端字符相等且内部子串为回文时,当前子串即为回文串。时间复杂度O(n^2),空间复杂度O(n^2)。最终返回最长回文子串的起始索引和长度。

2025-10-27 11:32:12 136

原创 算法287. 寻找重复数

该问题要求在给定数组中找出唯一重复的数字,且不修改数组和使用常量空间。解决方案采用快慢指针法:将数组视为链表,数值作为指针指向下一位置。快指针每次走两步,慢指针走一步,当两者相遇时,将快指针重置到起点,然后两者同步前进,再次相遇点即为重复数字。该方法巧妙地将查找重复数转化为链表环检测问题,满足题目要求的时间复杂度O(n)和空间复杂度O(1)。

2025-10-22 11:17:33 203

原创 算法31. 下一个排列

文章摘要:该算法用于寻找整数数组的下一个字典序排列。核心步骤为:1)从右向左找到第一个下降点i;2)在i右侧找到最小的大于nums[i]的数并交换;3)反转i之后的序列。该方法确保以最小变动得到下一个排列,时间复杂度O(n),空间复杂度O(1)。特殊处理完全降序数组时直接反转为升序排列。该算法高效且原地修改,满足题目要求。

2025-10-20 17:02:33 874

原创 动态规划三大经典模型对比笔记——LIS、0-1背包、完全背包

本文对比了动态规划的三大经典模型:最长递增子序列(LIS)、0-1背包和完全背包。LIS要求在序列中找出严格递增的最长子序列,核心是状态转移时比较数值大小。0-1背包限制每个物品只能选一次,需倒序遍历容量;完全背包则允许无限次选择,需正序遍历。三种模型在问题类型、状态维度和转移方式上各有特点:LIS保持序列顺序,背包问题关注资源限制下的组合优化。掌握它们的关键差异和实现细节,能有效解决不同类型的动态规划问题。

2025-10-17 16:10:05 774

原创 算法416. 分割等和子集

文章摘要 本题通过0-1背包思路解决数组分割问题。首先计算数组总和,若为奇数则直接返回false;若为偶数,问题转化为判断是否存在子集和等于总和的一半。采用记忆化搜索方法,定义dfs(i,j)表示前i+1个数能否凑出和j。状态转移考虑是否选择当前数字:当j≥nums[i]时,dfs(i,j)=dfs(i-1,j-nums[i])或dfs(i-1,j);否则只能不选。边界条件为i<0时返回j==0。最终检查dfs(n-1,target)是否为true。该解法完全符合0-1背包模型,时间复杂度为O(n×t

2025-10-17 15:58:01 931

原创 算法300. 最长递增子序列

这篇文章介绍了如何用动态规划解决最长递增子序列问题。通过递归+备忘录的方法,定义dfs(i)为以nums[i]结尾的最长递增子序列长度。对于每个元素nums[i],遍历之前所有比它小的元素nums[j],取最大的dfs(j)值加1。最终结果是所有dfs(i)中的最大值。该方法的时间复杂度为O(n^2),空间复杂度O(n),适用于数组长度不超过2500的情况。边界处理得当,当元素前面没有更小的数时,长度为1。

2025-10-17 11:46:06 338

原创 算法139. 单词拆分

解题思路: 该问题要求判断字符串 s 能否由字典 wordDict 中的单词拼接而成。使用动态规划结合记忆化搜索的方法,定义 dfs(i) 表示前 i 个字符能否被成功分割。通过倒序遍历,检查是否存在某个位置 j,使得 s[j:i] 在字典中且 dfs(j) 为真,若存在则返回真。利用备忘录 memo 存储中间结果,避免重复计算,提升效率。 关键点: 预处理字典为集合,提高查询速度 记录字典中最长单词长度,优化搜索范围 记忆化搜索避免重复计算子问题 时间复杂度: O(n^2),其中 n 为字符串长度。

2025-10-16 18:18:06 227

原创 算法279. 完全平方数

这篇文章介绍了如何用动态规划(DFS+记忆化)求解「和为n的完全平方数的最少数量」问题。核心思路是从最大的平方数开始,递归地选择「用」或「不用」当前平方数,并缓存结果避免重复计算。最终返回所有可能组合中的最小数量,时间复杂度通过记忆化优化为O(n√n)。文章通过具体示例(如n=12)拆解递归过程,并解释了边界条件和代码细节,帮助理解动态规划在背包类问题中的应用。

2025-10-14 17:28:08 954

原创 【动态规划】题目中的「0-1 背包」和「完全背包」的问题

这篇文章通过超市购物和硬币兑换的生动类比,清晰解释了0-1背包和完全背包的区别,并重点分析了完全背包问题的两个核心特征:物品可重复使用和状态转移顺序的重要性。作者以LeetCode 279题(完全平方数)为例,详细解读了如何使用记忆化搜索实现完全背包的动态规划解法,包括状态定义、转移方程、边界条件和初始调用,并通过具体示例演示了算法执行过程。全文使用通俗易懂的比喻和清晰的代码注释,帮助读者理解完全背包问题的本质及其在求解最少数量问题中的应用。

2025-10-14 17:23:04 921

原创 算法198. 打家劫舍

每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。输入:[2,7,9,3,1]输入:[1,2,3,1]

2025-10-13 16:41:27 433

原创 算法70. 爬楼梯

摘要:本文讨论爬楼梯问题的动态规划解法。到达第n阶楼梯的方法数等于前两阶方法数之和(f[n]=f[n-1]+f[n-2]),类似乘坐地铁可选择1站或2站到达终点的路线统计。题解一使用数组存储中间结果(O(n)空间),题解二优化为仅保存前两个状态(O(1)空间)。两种解法均基于最后一步只能走1或2步的分类计数原理,时间复杂度均为O(n)。

2025-10-13 15:25:41 163

原创 算法45. 跳跃游戏 II

这篇文章介绍了跳跃游戏II的解题思路,使用建桥的类比来解释贪心算法。通过维护当前桥的右端点和下一座桥的最远可达点,在遍历数组时收集信息,当无路可走时才建造新桥。代码只需遍历到倒数第二个元素,因为终点不需要造桥。时间复杂度为O(n),空间复杂度为O(1)。关键点是理解不是必须跳跃最大长度,而是在无路可走时选择能跳到最远点的位置建造新桥。

2025-10-13 11:23:35 432

原创 CentOS 7.9安装OpenSSL 1.1.1w

本文介绍了在Linux系统上安装OpenSSL 1.1.1w的详细步骤。首先下载源代码并解压,然后配置安装路径进行编译安装。接着设置环境变量使系统识别新版本,并通过编辑全局配置文件保证永久生效。最后验证安装是否成功。该过程解决了Python3.11安装时对OpenSSL版本的要求问题,同时避免了与系统自带OpenSSL的冲突。关键步骤包括指定安装目录、配置环境变量和验证版本号,确保新安装的OpenSSL能被系统正确识别和使用。

2025-10-09 11:02:52 637

原创 算法20. 有效的括号

摘要 该问题要求判断由括号组成的字符串是否有效。有效字符串需满足:左括号必须用同类型右括号闭合,且按正确顺序闭合。解决方法是使用栈数据结构:遇到左括号入栈,遇到右括号则检查是否与栈顶左括号匹配。关键点包括:字符串长度为偶数才能有效;使用哈希表存储括号对应关系;最终栈为空才返回真。该方法时间复杂度O(n),空间复杂度O(n),能高效验证括号有效性。

2025-10-06 00:47:02 179

原创 算法153. 寻找旋转排序数组中的最小值

本文探讨了如何在旋转排序数组中高效查找最小值的问题。通过观察旋转数组的特性,可将数组分为两部分:左半部分(较大值)和右半部分(较小值,包含最小值)。利用二分查找法,在O(log n)时间复杂度内定位第一个满足nums[i] <= nums[-1]的位置,该位置即为最小值所在。Python实现中,通过维护左右指针逐步缩小搜索范围,最终返回nums[right]即为所求最小值。该算法正确处理了各种旋转情况,包括未旋转的极端案例。

2025-10-05 22:58:50 428

Python3.8.0 windows64安装包

Python3.8.0 windows64安装包

2023-08-01

空空如也

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

TA关注的人

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