自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录算法训练营第62天|Floyd 算法精讲、A * 算法精讲 (A star算法)

分两种情况,一种是节点 i 到节点 j 的最短路径经过节点 k,grid[i][j][k] = grid[i][k][k-1] + grid[k][j][k-1];另一种情况,节点 i 到节点 j 的最短路径不经过节点 k,grid[i][j][k] = grip[i][j][k-1];刚开始初始化 k 是不确定的,如果赋值为1,那么不能知道节点 i 到节点 j 经过1个节点的最短距离,所以只能把 k 赋值为0,本题中节点0是无意义的,节点是从1到n。本题求的是最小值,所以其余值初始化为最大值。

2024-08-28 16:48:44 1349

原创 代码随想录算法训练营第61天|Bellman_ford 队列优化算法(又名SPFA)、bellman_ford之判断负权回路、bellman_ford之单源有限最短路

这道题和上一题的区别在于存在负权环路,在bellman_ford算法中,对于minDist数组,松弛n-1次所有边就可以得到起点到其他节点的最短距离,松弛n次以上,数组中的结果也不会改变。在对所有边进行松弛的过程中,有可能因为边的顺序导致所有节点都更新,这就可能违背至多经过k个节点的限制。Bellman_ford算法每次都对所有边进行松弛,但其实真正有效的松弛,是基于已经计算过的节点在做的松弛。在加入队列的过程可以有一个优化,用visited数组记录已经在队列里的元素,已经在队列的元素不用重复加入。

2024-08-28 10:35:13 429

原创 代码随想录算法训练营第60天|dijkstra(堆优化版)精讲、Bellman_ford 算法精讲

Bellman_ford算法的核心是对所有边进行松弛n-1次操作,n是节点数量,从而求得目标最短路。以此类推,节点数量为n,起点到终点最多有n-1条边,因此需要松弛n-1次。当从边的角度 出发,在处理第一步的时候就不需要遍历所有节点,而且直接把边加入到小顶堆中,那么每次从堆顶中取到的边自然就是距离源点最近的节点所在的边。,grid数组是用来存图的,是题目描述中必须要使用的空间,而不是算法使用的空间,因此只算minDist数组的空间。,建立邻接表,数组空间为N,有多少条边就对应多少的链表节点。

2024-08-26 15:00:40 1088

原创 代码随想录算法训练营第58天|拓扑排序精讲、dijkstra(朴素版)精讲

拓扑排序要检测这个有向图是否有环,即存在循环依赖的情况,因为这种情况是不能做线性排序的。拓扑排序的过程,有两步,第一步,找到入度为0的节点,加入结果集;第二步,将该节点从图中移除。结果集的顺序,就是想要的拓扑排序顺序。这道题是求最短路,最短路是图论中的经典问题,给出一个有向图,一个起点,一个终点,问起点到终点的最短路径。在dijkstra算法中,同样有一个数组很重要,起名为:minDist。prim算法是求非访问节点到最小生成树的最小距离,而dijkstra算法是求非访问节点到源点的最小距离。

2024-08-25 16:50:00 357

原创 代码随想录算法训练营第57天|prim算法精讲、kruskal算法精讲

最小生成树是所有节点的最小连通子图,以最小的成本将图中所有节点连接到一起。prim算法是从节点的角度,采用贪心的策略,每次寻找距离 最小生成树最近的节点 并加入到最小生成树中。minDist数组用来记录每一个节点距离最小生成树的最近距离,也就是最小生成树的边的权值。kruskal是维护边的集合,其思路为,边的权值排序,因为要优先选最小的边加入到生成树中;遍历排序后的边,如果边首尾的两个节点在同一个集合,说明如果连上这条边图会出现环,如果不在同一个集合里,加入最小生成树,并把两个节点加入同一集合。

2024-08-24 16:38:31 194

原创 代码随想录算法训练营第56天|108. 冗余连接、109. 冗余连接II

本题的本质是,有一个有向图,是由一颗有向树+一条有向边组成的。有向树的性质,只有根节点入度为0,其他节点入度为1,因为该树除了根节点外的每个节点都有且只有一个父节点,而根节点没有父节点。有三种情况,第一种情况,找到入度为2的点,删哪条都一样,那么删掉一条指向该节点的边就行了。第三种情况,如果没有入度为2的点,说明图中有环,删除构成环的边就可以了。从前往后遍历每一条边,判断边的两个节点是否在同一个集合,如果不在,则将它们加入集合,如果在,说明这两个点已经连在一起了,则这条边冗余。

2024-08-23 17:13:43 244

原创 代码随想录算法训练营第55天|并查集理论基础、107. 寻找存在的路径

并查集主要有两个功能:将两个元素添加到一个集合中,判断两个元素是否在同一个集合中。之间,且随着查询或者合并操作的增加,会越来越趋于。,路径压缩后的并查集时间复杂度在。

2024-08-23 11:43:23 287

原创 代码随想录算法训练营第54天|110. 字符串接龙、105.有向图的完全可达性、106. 岛屿的周长

同时,本题是个无向图,需要标记节点是否被访问过,不然会陷入死循环,使用集合来检查字符串是否出现在字符串集合中更快一点。用矩阵记录访问过的节点,深搜一遍之后,如果所有节点都被访问过,则输出1。本题是有向图搜索全路径的问题,dfs有两种写法,一种是处理当前访问的节点,如果是访问过的节点则终止本层递归;当走不通时,周长加一。走不通有两种情况,一种是之前访问过,另一种是遇到水域,因此具体为当遇到水域的时候周长加一。有两种解法,一种是遍历每格,遇到岛屿就计算其上下左右的空格情况,如果遇到水域和出界则说明是一条边。

2024-08-22 17:37:05 396

原创 代码随想录算法训练营第53天|101. 孤岛的总面积、102. 沉没孤岛、103. 水流问题、104.建造最大岛屿

思路:从地图周边出发,将周边空格相邻的陆地都做上标记,然后遍历一遍地图,遇到陆地且没有做过标记的,那么就是地图中间的陆地,全部改成水域就行。步骤一:将地图周边的陆地1全部改为特殊标记2;步骤二:将中间的陆地1全部改为水域0;第二步,再遍历一遍地图,遍历0,统计其由0变1周边的岛屿面积,将其相邻面积加在一起。调用递归函数时,visited列表会记录节点是否被访问过,因此每个节点只会访问一边,所有算法的时间复杂度为。将周边靠陆地且相邻的陆地都变成海洋,然后再重新遍历地图,统计还剩下的陆地就可以了。

2024-08-21 18:14:48 412

原创 代码随想录算法训练营第51天|99. 岛屿数量、100. 岛屿的最大面积

在 Python 中,global 关键字用于在函数内部声明一个变量是全局变量,而不是函数内部的局部变量。使用 global 可以使得函数内部对变量的修改反映到函数外部的全局范围。本题思路,是用遇到的一个没有遍历过的节点陆地,计数器加一,然后把该节点陆地所能遍历到的陆地都标记上。在遇到标记过陆地节点和海洋节点都直接跳过,这样计数器就是最终岛屿的数量。只要节点加入队列就代表走过,就需要标记,而不是从队列拿出来的时候再标记走过。这道题在上一题的基础上需要统计岛屿的面积。

2024-08-20 16:37:43 321

原创 代码随想录算法训练营第50天|98. 所有可达路径

在有向图中,每个节点有出度和入度,出度指从该节点出发的边的个数,而入度是指向该节点边的个数。度:无向图中有几条边连接该节点,该节点就有几度。广搜适合于解决两个点之间的最短路径问题。

2024-08-20 13:48:58 154

原创 代码随想录算法训练营第49天|42. 接雨水、84.柱状图中最大的矩形

单调栈是按行来计算雨水,栈是按递增的顺序,一旦发现添加的柱子高度大于栈头元素,此时出现凹槽,栈头元素是凹槽底部的柱子,栈头的第二个元素是凹槽左边的柱子,而添加的元素是凹槽右边的柱子。为什么在数组前加0:计算矩阵面积的三个要素,当前遍历的元素值,也就是判断完要入栈的元素值,也就是矩形的右边,栈顶第一个元素是当前矩形的高度,栈顶的第二个元素是左边,在数组前加0的目的在于是的栈顶第二个元素不为空。每一列雨水的高度,取决于该列最侧最高的柱子和右侧最高的柱子中最矮的柱子的高度。

2024-08-19 20:22:40 384

原创 代码随想录算法训练营第48天|739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II

单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是整个数组只需要遍历一次。在本题中,需要寻找右边第一个比自己大的元素,从栈头到栈底是递增的顺序,这样要加入当前元素的时候,可以得到栈顶元素在数组右边第一个更大的值是当前元素。这道题还是用单调栈来做,从栈顶到栈底是递增的顺序,思路是一样的,根据题目要求,考虑到要在nums2对应位置往后寻找第一个更大的元素,因此需要遍历nums2。解决循环数组只需要遍历的过程中模拟走两遍。

2024-08-19 16:32:55 420

原创 代码随想录算法训练营第47天| 647. 回文子串、516.最长回文子序列

如果s[i]和s[j]相等,如果i=j,则dp[i][j]=True;如果j-i>1,当d[i+1][j-1]=True时,dp[i][j]=True。如果s[i]和s[j]相等,那么dp[i][j]=dp[i+1][j-1]+2;如果不等,dp[i][j]=max(dp[i+1][j],dp[i][j-1])dp[i][j]表示区间范围[i,j](左闭右闭)的子串是否是回文子串。dp[i + 1][j - 1] 在 dp[i][j]的左下角,遍历i从底向上,j从前往后。dp[i][i]=1,其余为0。

2024-08-18 21:02:42 278

原创 代码随想录算法训练营第46天|115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离

如果不相等,A删除][i-1],则为dp[i-1][j]+1,B删除[j-1],等同于A增加,则为dp[i][j-1] + 1,A替换元素,则为dp[i-1][j-1]+1,因此取三种情况的最小值。如果 s[i-1] 和 t[j-1] 相等,有两种情况,使用s[i-1]进行匹配或者不使用,因此,dp[i][j] = dp[i-1][j-1] + dp[i-1][j]。如果不相等,dp[i][j] = min(dp[i-1][j-1] + 2,dp[i-1][j] +1,dp[i][j-1] +1)

2024-08-17 19:20:19 305

原创 代码随想录算法训练营第44天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和、392.判断子序列

我想叉了,A字符串为‘abcde’,B字符串为’ace’,在比较到 c 相等时,dp[i][j] = dp[i-1][j-1] + 1,因为dp[i-1][j-1]的值并不是指最长子序列必须以[i-1]和[j-1]这两个字母结尾,就是说,c相等,只需要在’ab’和’a’的最长子序列的长度上加一就行,并不需要去纠结 c 前面两个字符串哪个字符相等。如果A[i-1]=B[j-1],那么dp[i][j] = dp[i-1][j-1] + 1。(1)确定数组和下标。

2024-08-16 19:22:45 447

原创 代码随想录算法训练营第43天|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

我一下子就想到之前做过的求最长摆动子序列长度的那道贪心算法题,想通过峰值来求最长递增子序列长度,但没想到,以[0,1,0,3,2,3]为例,从峰值看,0-1-3,只有三段,实际上可以加入2变成长度为4。使用2维数组来定义,dp[i][j]表示A中 i-1 个元素结尾,B中 j-1 个元素结尾的子数组的最大长度;如果numsA[i-1] = numsB[j-1],那么dp[i][j] = dp[i-1][j-1] + 1。找到比nums[i]小的元素 j,dp[i]取dp[j] + 1中的最大值。

2024-08-15 11:44:05 436

原创 代码随想录算法训练营第42天|188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

今天买入,可以由0和3状态得到,dp[i-1][1] - prices[i]或者dp[i-1][3] - prices[i]dp[i][2]:第 i 天卖出股票,那么则为dp[i-1][1] + prices[i];dp[i][1]:第 i 天买入股票,那么则为dp[i-1][0]- prices[i];dp[i][1]:之前卖出,dp[i-1][1];dp[i][j为奇数] = -prices[0],dp[0][j为偶数] = 0;dp[i][1]:dp[i-1][1]或者dp[i-1][3]

2024-08-14 17:28:55 536

原创 代码随想录算法训练营第41天|121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

dp[i][0]:持有股票有两种情况,一种是股票在之前买入,那么则为dp[i - 1][0];dp[i][1]:不持有股票的两种情况,一种是之前就卖掉了,则为dp[i-1][1];dp[i][0]:持有股票有两种情况,一种是股票在之前买入,那么则为dp[i - 1][0];dp[i][1]:不持有股票的两种情况,一种是之前就卖掉了,则为dp[i-1][1];dp[i][0]表示第一次持有股票,dp[i][1]表示第一次不持有,dp[i][2]表示第二次持有,dp[i][3]表示第二次不持有。

2024-08-13 15:03:27 584

原创 代码随想录算法训练营第40天|198.打家劫舍、213.打家劫舍II、337.打家劫舍 III

单层递归逻辑,该节点不偷,左右孩子都可以考虑偷,dp[0] = max(leftdp[0], leftdp[1])+ max(rightdp[0], rightdp[1]);该节点偷,那么左右孩子不偷,dp[1] = node.value + leftdp[0] + rightdp[0]。那么则为dp[ i ] = max(dp[ i-2 ] + nums[ i ], dp[ i-1 ])dp[0] = nums[0],dp[1] = max(nums[0], nums[1]),其余为0。

2024-08-12 16:11:52 376

原创 代码随想录算法训练营第39天|322. 零钱兑换、279.完全平方数、139.单词拆分、多重背包

dp[ j ] = min(dp[ j ], dp[ j - i ] + 1),i 是遍历的完全平方数。如果区间[j,i]区间内的子串出现在字典里并且dp[j] = True,那么dp[i] = True。dp[ i ]表示字符串长度为 i,是否可以拆分为一个或者多个在字典中出现的单词。dp[0] = 0,其余位置因为会比较取最小值,初始化为’inf’dp[0] = True,因为是递推的根基,否则后面都为False。dp[ j ] 表示和为 j 的最少完全平方数。dp[0] = 0,其他取’inf’

2024-08-05 15:27:46 331

原创 代码随想录算法训练营第37天|完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、70. 爬楼梯(进阶版)

打卡Day371.完全背包理论基础2.518.零钱兑换II3.377. 组合总和 Ⅳ4.70. 爬楼梯(进阶版)1.完全背包理论基础题目链接:完全背包理论基础文档讲解: 代码随想录01背包和完全背包的区别:01背包中每个物品只能使用一次,而完全背包中可以重复使用,每种物品有无数件。这点不同会体现在遍历顺序上,直接针对遍历顺序进行分析。01背包的内部循环遍历背包容量时是从后往前的,为了确保每个物品只被加入一次。而在纯完全背包问题中,这个内部循环是从前往后的,因为每个物品可以重复使用。同时,对于纯完

2024-08-04 19:52:33 360

原创 代码随想录算法训练营第36天|1049.最后一块石头的重量II、494.目标和、474.一和零

1049.最后一块石头的重量II文档讲解:代码随想录本题就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解为01背包问题。(1)确定dp数组和小标的含义dp[ j ] 表示容量为 j 的背包,最多可装的价值(2)递推关系式(3)初始化因为重量都不会是负数,所以dp[j]都初始化为0就可以了(4)遍历顺序(5)打印数组""""""

2024-08-03 15:38:27 333

原创 代码随想录算法训练营第35天|01背包理论基础、01背包理论基础(滚动数组)、416. 分割等和子集

因此递推公式为dp[ i ][ j ] = max(dp[ i-1 ][ j ],dp[ i-1 ][ j - weight[i]] + value[ i ])。二维数组dp[i][j]都是通过上一层即dp[i - 1][j]计算而来,本层的dp[i][j]并不会被覆盖!观察递推关系式,dp[ i ][ j ]主要由dp[ i-1 ][ j ]和dp[ i-1 ][ j - weight[i]]求到,只要上方和左上方有值就可以,因此两层循环遍历背包和物品的顺序无论先后,都可以得到答案。

2024-08-01 15:34:43 771

原创 代码随想录算法训练营第34天|62.不同路径、63. 不同路径 II、343. 整数拆分、96.不同的二叉搜索树

j的结束条件是 j < i - 1 ,其实 j < i 也是可以的,不过可以节省一步,例如让 j = i - 1,的话,其实在 j = 1的时候,这一步就已经拆出来了,重复计算,所以 j < i - 1。dp[ i ][ j ] = dp[ i - 1 ][ j ] + dp[ i ][ j - 1],但要考虑若该点有障碍物,那么就保持初始状态。机器人只能向下或者向右移动一步,那么就有dp[ i ][ j ] = dp[ i - 1 ][ j ] + dp[ i ][ j - 1]

2024-07-30 16:45:22 883

原创 代码随想录算法训练营第33天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

dp[ i ]可以由 dp[i - 1] 跳一步到达,或者 dp[i - 2] 跳两步到达,那么可以得到关系式:dp[ i ] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])题目说可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯,那么则说明 dp[0] = 0,dp[1] = 0。关于dp[0],题目中明确表明 n 是个正整数,因此dp[0] 是无实际意义的,因此初始化从1、2开始。(5)举例推导dp数组(打印数组)(3)dp数组初始化。

2024-07-29 19:54:50 326

原创 代码随想录算法训练营第32天|56. 合并区间、738.单调递增的数字、968.监控二叉树

第一种情况,只要左右孩子有一个0,则父节点需要放置摄像头,为1状态。第四种情况,夫节点为头节点,且为状态0,则此时需要在头节点放置摄像头。如果空节点标记为放置摄像头,那么叶子节点则是有覆盖的状态,这样的话其父节点不会放置摄像头。这两种情况都与期望不符。想要让摄像头数量最少,关键是摄像头放置的位置,需要从叶子节点后序遍历,因为叶子节点放不放摄像头省下的摄像头数量是指数阶别的,而头节点放不放摄像投就就省下一个。(1)此时需要状态转移,可以将节点的状态分为三种情况:无覆盖(0)、放置摄像头(1)、有覆盖(2)。

2024-07-29 14:28:59 429

原创 代码随想录算法训练营第30天|452. 用最少数量的箭引爆气球、435. 无重叠区间、763.划分字母区间

思路:射重叠最多的气球,用的弓箭最少。模拟气球被射爆,没有必要在数组中将元素移走,被射过的气球跳过,记录箭的数量。为了让气球尽可能的重叠,需要对数组进行排序,按照起始位置排序,从前往后遍历,如果气球重叠,重叠气球中右边界最小值需要一个弓箭。思路:在遍历过程中,需要寻找每个字母的最远边界。主要分为两步,统计每个字母最后出现的位置;从头遍历字符串,并更新字符出现的最远下标,若最远下标与当前下标相同时,则进行切割。思路:首先根据起始位置对区间进行排序。不用去想删掉哪个区间,更新右边界判断是否与下一个区间重合。

2024-07-27 20:55:00 332

原创 代码随想录算法训练营第29天|134. 加油站、135. 分发糖果、860.柠檬水找零、406.根据身高重建队列

只要右边评分比左边大,右边的孩子就多一个糖果,可以达到全局最优:相邻的孩子中,评分高的右孩子获得比左孩子更多的糖果。思路:如果 gas 的总和小于 cost 的总和,说明无论从哪里出发,肯定不能跑一圈。定义 rest 记录每天剩下的油,从0开始计算累加,如果遇到负数,则从下一个站点算起。思路超级简单,根据收到的面额大小制定不同的找零策略。思路:和分发糖果一样,不能同时考虑身高和 k,因此先按照身高降序排列,然后再根据 k 来调整队列。这道题的暴力解法,是用 for 遍历,用 while 模拟跑一圈的情况。

2024-07-27 15:13:19 183

原创 代码随想录算法训练营第28天|122.买卖股票的最佳时机 II、55. 跳跃游戏、45.跳跃游戏 II、1005.K次取反后最大化的数组和

到达当前这步的最大覆盖范围的最远距离,还没有达到终点的话,就需要跳一步,范围扩大到下一步的最大覆盖范围,直到跳到终点。针对到达当前覆盖范围的最远距离的特殊情况,可以统一处理,一旦到达此位置,那么步数结果加一。我的思路:for循环遍历每个元素,计算该点到最后一个元素的目标距离,如果目标距离小于等于元素值,那么就说明可以达到。标答思路:将问题转化为跳跃覆盖范围是否可以覆盖终点。i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。

2024-07-25 16:16:24 419

原创 代码随想录算法训练营第27天|455.分发饼干、376. 摆动序列、53. 最大子序和

局部最优:删除单调坡度上的节点,那么这个坡度就会有两个局部峰值。定义两个变量来记录前后差值,prediff = nums[i] - nums[i-1],curdiff = nums[i+1] - nums[i],要么 prediff 小于0、curdiff 大于0,或者 prediff 大于0、curdiff 小于0。正确的应该判断连续和是否为负,完整思路则是,初始化count = 0, 遍历过程,count先加上当前元素值,若大于res则替换,接着判断是否不为正数,若非正,则再次初始化count。

2024-07-24 19:14:34 445

原创 代码随想录算法训练营第26天|491.递增子序列、46.全排列、47.全排列 II、332.重新安排行程、51. N皇后、37. 解数独

目前仍在补,已经是一周左右的进度差,但我有我的节奏!最后三道题超难!!!

2024-07-23 16:03:37 848

原创 代码随想录算法训练营第25天|93.复原IP地址、78.子集、90.子集II

题解思路:回溯算法将所有可能性搜出来,然后需要定义一个函数来判断分割出来的是否合法。递归终止条件,本题明确要求分成四段,所以不能用切割线切到最后作为终止条件,要使用分割的段数作为终止条件。判断子串是否合法主要考虑三点,段位以0为开头的数字不合法、段位里有非正整数字符不合法、段位如果大于255不合法。我的思路:按照昨天分割回文子串的思路,只是把判断是否是回文子串换成了判断数值在0~255之间,但是忘记了限制IP地址的数字只有4个。这道题和上一题不一样的地方就在于元素有重复的,需要去重。还可以利用集合来去重。

2024-07-22 14:26:34 320

原创 代码随想录算法训练营第23天|39. 组合总和、40.组合总和II、131.分割回文串

因此,要去重的是同一树层上的相同元素,同一树枝上是一个组合里的元素,是可以重复的,因此不用去重。具体来说,给定一个字符串 s,长度为 n,成为回文串的充分必要条件是 s[0] == s[n -1] 且 s[1:n - 1] 也是回文串,因此可以在回溯算法前,计算出 s 中所有子串是否为回文串,然后递归的时候直接查询就可以了。假设对于字符串abcde,切割问题思路是,先切割 a,再在bcde中切割第二段,切割 b 后,再切割第三段,这与组合的选取思路是类似的,因此可以抽象为组合问题。(2)如何模拟切割线。

2024-07-21 17:29:18 770

原创 代码随想录算法训练营第22天|第77题. 组合、216.组合总和III、17.电话号码的字母组合

(4)关于回溯算法,以图为例,为什么会在[1,4]后实现两次pop:因为for循环遍历到 i = 1,利用递归取到[1,4],会将4弹出结束 self.backtracking(n, k, i + 1, path, res),然后再弹出1进入 i = 2 的循环。(1)回溯函数返回值和参数,一般取名为 backtracking,返回值一般为 void,参数的话,先写逻辑,需要什么参数就填什么参数。(1)combine函数中调用回溯函数的时候,startindex为1,是因为题目中说明了范围为[1,n]。

2024-07-20 11:35:31 300

原创 代码随想录算法训练营第21天|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

我的思路:这道题和昨天450.删除二叉搜索树中的节点很像,如果要删除节点,还是将删除节点的左子树移动到右子树最左面的节点上。在力扣上是不通过的,我觉得可能是中间节点处理顺序导致的,然后改成后序遍历就可以了,自底向上递归。思路:不用重构二叉树,以下图为例,low = 1, high = 3,0 是要删除的节点,只需要将 0 的右孩子直接赋给3的左孩子就可以了。思路:二叉搜索树是有序的,从树中可以看出累加顺序为右中左,然后顺序累加。本题需要利用pre指针来记录当前遍历节点cur的前一个节点。

2024-07-17 17:02:45 371

原创 代码随想录算法训练营第20天|235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

这道题和上一题寻找最近公共祖先,不一样的地方在于,这道题是二叉搜索树,二叉搜索树的特点是有序。可以不考虑题目中说的改变树结构的插入方式,二叉搜索树是有序的,遍历遇到空节点插入就可以了,因为题目中已经说明了二叉搜索树中的元素值和插入值都是独一无二的。(3)单层逻辑:因为不确定 p 和 q 的大小关系,因此,若节点值大于 p 和 q 的值,则往左子树搜索,若都小于则往右子树搜索。普通二叉树的解法,没有利用二叉搜索树的特性,用交换值的操作来删除节点。(1)第一次,是和目标节点的右子树的最左面的节点做交换。

2024-07-16 17:57:42 319

原创 代码随想录算法训练营第19天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

求最近公共祖先,需要从底向上遍历,因此采用后序遍历。在回溯过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点都遍历,因为要使用递归函数的返回值做逻辑判断。学会在递归遍历的过程中记录前后两个指针,而且二叉搜索树是有序的,需要利用这个特性来作题。我感觉和昨天验证是否是有效二叉搜索树的思路是一样的。递归法,利用字典,针对普通二叉树。递归法,利用二叉搜索树有序的特性。迭代法:用的统一迭代中的中序遍历。利用中序递增找到该树最小值。利用中序递增,结合数组。

2024-07-16 14:30:03 222

原创 代码随想录算法训练营第18天|654. 最大二叉树、617.合并二叉树、700. 二叉搜索树中的搜索、98.验证二叉搜索树

标答思路:终止条件,在数组中只有一个元素的时候构造一个新节点返回;单层逻辑,找到数组中最大值以及对应的下标,根据下标左区间构造左子树,需要判断最大值下标大于0,以确保左子树至少有一个值,同理,要判断最大值下标小于数组长度减一,以确保右子树至少有一个值。(1)不能单纯的比较左节点小于中间节点,右节点大于中间节点。要比较的是左子树的所有节点都小于中间节点,右子树的所有节点都大于中间节点。(2)建议避免初始化最小值,因此做出改进,取到最左面的节点数值来比较。递归法,利用中序递增性质,转换成数组。

2024-07-11 20:29:02 311

原创 代码随想录算法训练营第16天|513. 找树左下角的值、112. 路径总和、106.从中序与后序遍历序列构造二叉树

不可以,因为无法确定中间节点在哪里,不能唯一确定一棵二叉树。

2024-07-09 16:43:13 230

空空如也

空空如也

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

TA关注的人

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