自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【542. 01 矩阵 中等】

时间复杂度:O(M * N),其中 M 是矩阵的行数,N 是矩阵的列数。每个单元格最多被访问一次。空间复杂度:O(M * N),用于队列。

2025-02-28 21:50:57 555

原创 【1162. 地图分析 中等】

时间复杂度:O(N^2),其中 N 是网格的边长。每个单元格最多被访问一次。空间复杂度:O(N^2),队列中最多存储所有陆地单元格。多源bfs需要先把所有的起点都加入队列,同时进行单源bfs,这样重复的路程不再经过,不仅得出的答案正确,而且时间复杂度大大降低,这也就是多源BFS的核心思路,多个起点同时用单源BFS的方法去找最短路径。

2025-02-28 21:01:58 611

原创 A*算法实现

A * 算法的时间复杂度 其实是不好去量化的,因为他取决于 启发式函数怎么写。最坏情况下,A * 退化成广搜BFS,算法的时间复杂度 是 O(n^2),n 为节点数量。最佳情况,是从起点直接到终点,时间复杂度为 O(dlogd),d 为起点到终点的深度。因为在搜索的过程中也需要堆排序,所以是 O(dlogd)。实际上 A * 的时间复杂度是介于 最优 和最坏 情况之间, 可以 非常粗略的认为 A * 算法的时间复杂度是 O(nlogn) ,n 为节点数量。

2025-02-21 18:03:58 650

原创 dijkstra(堆优化版)

时间复杂度:O(ElogE) E 为边的数量空间复杂度:O(N + E) N 为节点的数量如何利用邻接表或邻接矩阵存储图结构。如何设计小顶堆和优先队列。如何遍历邻接节点。

2025-02-20 19:21:45 574

原创 邻接矩阵和邻接表的转换

邻接矩阵和邻接表都要掌握。

2025-02-19 11:05:57 457

原创 【99. 岛屿数量】

广搜的搜索方式就适合于解决两个点之间的最短路径问题。因为广搜是从起点出发,以起始点为中心一圈一圈进行搜索,一旦遇到终点,记录之前走过的节点就是一条最短路。当然,也有一些问题是广搜 和 深搜都可以解决的,例如岛屿问题,这类问题的特征就是不涉及具体的遍历方式,只要能把相邻且相同属性的节点标记上就行。

2025-02-18 17:02:04 1044

原创 【98. 所有可达路径】

本题是一道简单的深搜题目,也可以说是模板题,和 力扣797. 所有可能的路径思路是一样一样的。对于这种有向图路径问题,最合适使用深搜,当然本题也可以使用广搜,但广搜相对来说就麻烦了一些,需要记录一下路径。而深搜和广搜都适合解决颜色类的问题,例如岛屿系列,其实都是 遍历+标记,所以使用哪种遍历都是可以的。

2025-02-18 10:25:02 779

原创 【01 背包】

使用一维dp数组的写法,比较直观简洁,而且空间复杂度还降了一个数量级!一维dp遍历背包的顺序是倒序,倒序遍历是为了保证物品i只被放入一次!如果正序遍历了,那么物品0就会被重复加入多次!所以要倒序,先算容量大时的最大价值总和,才能保证背包容量小时的价值总和未被新计算的值覆盖。纯二维的01背包,代码中的两个for循环的嵌套顺序可以反过来。一维数组的01背包,两个for循环的顺序不能反过来。因为对于二维dp,dp[i][j]都是通过上一层即dp[i - 1][j]计算而来,本层的dp[i][j]并不会被覆盖。

2025-02-15 11:37:20 237

原创 【746. 使用最小花费爬楼梯 简单】

时间复杂度:O(n)空间复杂度:O(n)

2025-02-12 10:40:16 806

原创 【509. 斐波那契数 简单】

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。贪心解决不了动态规划的问题。时间复杂度:O(n)空间复杂度:O(n)斐波那契数列这道题目是非常基础的题目,这里严格按照动规五部曲来分析了这道题目。

2025-02-11 21:39:58 685

原创 【968. 监控二叉树 困难】

时间复杂度: O(n),需要遍历二叉树上的每个节点空间复杂度: O(n)本题的难点首先是要想到贪心的思路,然后就是遍历和状态推导。

2025-02-06 18:56:09 670

原创 【738. 单调递增的数字 中等】

时间复杂度:O(n),n 为数字长度空间复杂度:O(n),需要一个字符串,转化为字符串操作更方便本题只要想清楚个例,例如98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]减一,strNum[i]赋值9,这样这个整数就是89。就可以很自然想到对应的贪心解法了。想到了贪心,还要考虑遍历顺序,只有从后向前遍历才能重复利用上次比较的结果。最后代码实现的时候,也需要一些技巧,例如用一个flag来标记从哪里开始赋值9。

2025-02-06 11:33:49 244

原创 【435. 无重叠区间 中等】

时间复杂度:O(nlog n) ,有一个快排空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间。

2025-02-04 17:51:04 877

原创 【452. 用最少数量的箭引爆气球 中等】

时间复杂度:O(nlog n),因为有一个快排空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间。

2025-01-28 16:02:00 823

原创 【406. 根据身高重建队列 中等】

时间复杂度:O(nlog n + n^2)空间复杂度:O(n)关于出现两个维度一起考虑的情况,我们已经做过两道题目了,另一道就是135. 分发糖果。其技巧都是确定一边然后贪心另一边,两边一起考虑,就会顾此失彼。这道题目可以说比135. 分发糖果难不少,其贪心的策略也是比较巧妙。

2025-01-27 18:55:32 637

原创 【135. 分发糖果 困难】

时间复杂度: O(n)空间复杂度: O(n)这在leetcode上是一道困难的题目,其难点就在于贪心的策略,如果在考虑局部的时候想两边兼顾,就会顾此失彼。那么本题采用了两次贪心的策略:一次是从左到右遍历,只比较右边孩子评分比左边大的情况。一次是从右到左遍历,只比较左边孩子评分比右边大的情况。这样从局部最优推出了全局最优,即:相邻的孩子中,评分高的孩子获得更多的糖果。

2025-01-27 17:30:21 557

原创 【1005. K 次取反后最大化的数组和 简单】

时间复杂度: O(nlogn)空间复杂度: O(1)

2025-01-24 22:31:45 431

原创 【45. 跳跃游戏 II 中等】

时间复杂度: O(n)空间复杂度: O(1)这道题目相当于55.跳跃游戏难了不止一点。但代码又十分简单,贪心就是这么巧妙。理解本题的关键在于:以最小的步数增加最大的覆盖范围,直到覆盖范围覆盖了终点,这个范围内最少步数一定可以跳到,不用管具体是怎么跳的,不纠结于一步究竟跳一个单位还是两个单位。

2025-01-24 13:31:16 692

原创 【376. 摆动序列 中等】

时间复杂度:O(n)空间复杂度:O(1)题目要求的是最长摆动子序列的长度,所以只需要统计数组的峰值数量就可以了。情况一:上下坡中有平坡情况二:数组首尾两端情况三:单调坡中有平坡其实本题看起来好像简单,但需要考虑的情况还是很复杂的,而且很难一次性想到位。本题异常情况的本质,就是要考虑平坡, 平坡分两种,一个是 上下中间有平坡,一个是单调有平坡。

2025-01-23 22:11:58 866

原创 【455. 分发饼干 简单】

时间复杂度:O(nlogn)空间复杂度:O(1)这道题是贪心很好的一道入门题目,思路还是比较容易想到的。文中详细介绍了思考的过程,想清楚局部最优,想清楚全局最优,感觉局部最优是可以推出全局最优,并想不出反例,那么就试一试贪心。

2025-01-23 20:27:55 760

原创 【37. 解数独 困难】

解数独可以说是非常难的题目了,如果还一直停留在单层递归的逻辑中,这道题目可以让大家瞬间崩溃,所以在开篇就提到了二维递归.

2025-01-23 15:30:13 927

原创 【51. N 皇后 困难】

时间复杂度: O(n!空间复杂度: O(n)可以看出,除了验证棋盘合法性的代码,省下来部分就是按照回溯法模板来的。棋盘的宽度就是for循环的长度,递归的深度就是棋盘的高度,这样就可以套进回溯法的模板里了。

2025-01-23 14:18:02 665

原创 【332. 重新安排行程 困难】

本题其实可以算是一道hard的题目了,关于本题的难点在文中已经列出了。如果单纯的回溯搜索(深搜)并不难,难还难在容器的选择和使用上。本题其实是一道深度优先搜索的题目,但是完全使用回溯法的思路也可以做这道题题目,其实深搜和回溯也是分不开的,毕竟最终都是用递归。

2025-01-15 22:14:48 588

原创 【46. 全排列 中等】

时间复杂度: O(n!空间复杂度: O(n)每层都是从0开始搜索而不是startIndex需要used数组记录path里都放了哪些元素了。

2025-01-15 20:35:48 620

原创 【491. 非递减子序列 中等】

时间复杂度: O(n * 2^n)空间复杂度: O(n)首先要保证是递增的子序列要找出数组中不同的递增子序列,所以需要去重。并且由于求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。所以不能使用90. 子集 II 中等中的排序后去重的方法。

2025-01-15 10:28:23 755

原创 【131. 分割回文串 中等】

时间复杂度: O(n * 2^n)空间复杂度: O(n^2)切割问题可以抽象为组合问题如何模拟那些切割线切割问题中递归如何终止在递归循环中如何截取子串如何判断回文。

2025-01-13 15:50:36 782

原创 【40. 组合总和 II 中等】

时间复杂度: O(n * 2^n)空间复杂度: O(n)本题同样是求组合总和,但就是因为其数组candidates有重复元素,而要求不能有重复的组合,所以相对于39.组合总和难度提升了不少。

2025-01-12 21:37:09 935

原创 【39. 组合总和 中等】

时间复杂度: O(n * 2^n),注意这只是复杂度的上界,因为剪枝的存在,真实的时间复杂度远小于此空间复杂度: O(target)组合没有数量要求元素可无限重复选取针对这两个问题,都做了详细的分析。并且给出了对于组合问题,什么时候用startIndex,什么时候不用,并用17.电话号码的字母组合 做了对比。最后还给出了本题的剪枝优化。在求和问题中,排序之后加剪枝是常见的套路!

2025-01-12 20:30:00 1231

原创 【17. 电话号码的字母组合 中等】

时间复杂度: O(3^m * 4^n),其中 m 是对应三个字母的数字个数,n 是对应四个字母的数字个数空间复杂度: O(3^m * 4^n)本并重点强调了和前面讲解过的77.组合 中等的区别,本题是多个集合求组合,所以在回溯的搜索过程中,都有一些细节需要注意的。

2025-01-12 16:28:21 949

原创 【77. 组合 中等】

时间复杂度: O(n * 2^n)空间复杂度: O(n)组合问题是回溯法解决的经典问题,开始的时候列举一个很形象的例子,就是n为100,k为50的话,直接想法就需要50层for循环。从而引出了回溯法就是解决这种k层for循环嵌套的问题。然后进一步把回溯法的搜索过程抽象为树形结构,可以直观的看出搜索的过程。接着用回溯法三部曲,逐步分析了函数参数、终止条件和单层搜索的过程。最后对求组合问题的回溯法代码做了剪枝优化。

2025-01-11 22:01:42 1091

原创 【108. 将有序数组转换为二叉搜索树 简单】

106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树 中等654.最大二叉树 中等中其实已经讲过了,如果根据数组构造一棵二叉树。该题与上述两题思路一样,注意循环不变量原则。

2025-01-09 17:01:34 313

原创 【669. 修剪二叉搜索树 中等】

修剪二叉搜索树其实并不难,但在递归法中如何删除节点的,这个思路其实是比较绕的。

2025-01-07 22:19:07 1006

原创 【450. 删除二叉搜索树中的节点 中等】

读完本篇,会发现二叉搜索树删除节点比增加节点复杂的多。因为二叉搜索树添加节点只需要在叶子上添加就可以的,不涉及到结构的调整,而删除节点操作涉及到结构的调整。这里我们依然使用递归函数的返回值来完成把节点从二叉树中移除的操作。这里最关键的逻辑就是第五种情况(删除一个左右孩子都不为空的节点),这种情况一定要想清楚。而且就算想清楚了,对应的代码也未必可以写出来,所以这道题目既考察思维逻辑,也考察代码能力。迭代法就是模拟递归法中的逻辑来删除节点,但需要一个pre记录cur的父节点,方便做删除操作。

2025-01-07 21:38:43 1052

原创 【701. 二叉搜索树中的插入操作 中等】

首先在二叉搜索树中的插入操作,不用恐惧其重构搜索树,其实根本不用重构。然后在递归中,重点讲了如何通过递归函数的返回值完成新加入节点和其父节点的赋值操作,并强调了搜索树的有序性。最后依然给出了迭代的方法,迭代的方法就需要记录当前遍历节点的父节点了,这个和没有返回值的递归函数实现的代码逻辑是一样的。

2025-01-07 11:32:55 630

原创 【235. 二叉搜索树的最近公共祖先 中等】

对于二叉搜索树的最近祖先问题,其实要比普通二叉树公共祖先问题简单的多。不用使用回溯,二叉搜索树自带方向性,可以方便的从上向下查找目标区间,遇到目标区间内的节点,直接返回。最后给出了对应的迭代法,二叉搜索树的迭代法甚至比递归更容易理解,也是因为其有序性(自带方向性),按照目标区间找就行了。

2025-01-06 22:26:56 1193

原创 【236. 二叉树的最近公共祖先 中等】

归纳如下三点:求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从底向上的遍历方式。在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。迭代法不适合模拟回溯的过程。理解递归的解法就够了。

2025-01-06 21:12:09 986

原创 【501. 二叉搜索树中的众数 简单】

本题在递归法中,给出了如果是普通二叉树,应该怎么求众数。知道了普通二叉树的做法时候,再进一步给出二叉搜索树又应该怎么求众数,这样鲜明的对比,相信会对二叉树又有更深层次的理解了。在递归遍历二叉搜索树的过程中,还介绍了一个统计最高出现频率元素集合的技巧, 要不然就要遍历两次二叉搜索树才能把这个最高出现频率元素的集合求出来。为什么没有这个技巧一定要遍历两次呢?因为要求的是集合,会有多个众数,如果规定只有一个众数,那么就遍历一次稳稳的了。

2025-01-03 23:05:03 824

原创 【530. 二叉搜索树的最小绝对差 简单】

二叉搜索树是有序的,所以差值的最小值会出现在相邻两个节点之间。遇到在二叉搜索树上求什么最值啊,差值之类的,就把它想成在一个有序数组上求最值,求差值,这样就简单多了。

2025-01-03 17:57:04 432

原创 【98. 验证二叉搜索树 中等】

节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。同时要避免陷阱1:仅比较左节点小于中间节点,右节点大于中间节点就完事了。应该确保左子树所有节点小于中间节点,右子树所有节点大于中间节点。

2025-01-02 22:32:55 744

原创 【700. 二叉搜索树中的搜索 简单】

在递归时,可以根据值的大小,有方向的去搜索。在迭代时,可以不使用辅助栈或者队列就可以写出迭代法。

2025-01-01 23:09:37 722

空空如也

空空如也

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

TA关注的人

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