- 博客(58)
- 收藏
- 关注
原创 代码随想录算法训练营总结
网上有很多关于某道题目的具体解法的文章,就像我们训练营每天都要打卡的每日文章,我认为关键不在于写出来了代码,而是说你能自己感悟出其中的奥妙,为什么这么做,所以一定要做好总结,我一直认为总结是记录一道题,一个算法的精髓所在,每个人关注的点不一样,所以我写的总结都是我思考后对我来说重要以及需要关注的点,只要能学到东西,受到启发,那这个总结也就有了意义,不用去管具体形式,内容是否精致,当然这是我的个人看法。但是目前一刷过后,我在看到题后先想一想这道题是什么类型的题目,比如能用贪心吗?先说以下总体感受,非常值得!
2024-10-06 19:57:52
539
1
原创 代码随想录算法训练营第62天 | 1、小明的逛公园,2、骑士的攻击
注意这里的初始化以及遍历顺序,初始化就相当于在三维空间中,将k固定,i、j平面的grid不断比较更新得到最短路径,所以当前层的k会使用到它的前一层k-1,因为它的k-1已经是前面情况里面最短的情况了。为了更好地找到这样的点,所以需要对放入队列的元素按f排序,所以需要用到优先队列,每次从队列里面取的时候也是取的f最小的,从而能够大大简化搜索效率。每条道路上行走的距离都是已知的。小明喜欢去公园散步,公园内布置了许多的景点,相互之间通过小路连接,小明希望在观看景点的同时,能够节省体力,走最短的路径。
2024-10-01 00:13:27
980
原创 代码随想录算法训练营第60天 | 1、城市间货物运输I,2、城市间货物运输II,3、城市间货物运输III
因为每次松弛操作只会更新一条路径,所以如果每次松弛操作都对每条边进行则会造成冗余计算,因为后续的结果会将前面的结果覆盖掉,比如进行第一次松弛操作,那么则会更新从源点出发的一条路径,如果按照之前没有优化的算法,那么则会将每条边进行操作,但是有效的就只有从源点出发的第一条路径,第二次松弛操作时,有效的是从源点出发跨两条路径的路径,这时就会对第一次的跨两条路径的值覆盖掉,以此类推,所以其实可以不用在每次松弛操作时都对每一条边更新。注意这里的k=2是最多能经过的结点,也可以少于它,只要最后是最短的即可。
2024-09-28 22:02:11
1128
原创 代码随想录算法训练营第59天 | 1、参加科学大会,2、城市间货物运输I
所谓松弛操作就是求一个结点的最短路径的时候,可能等于前一个结点的最短路径加上边的权值,也可能本身这个最短路径就是已知的,即minDist[B] = minDist[A] + val或者就等于minDist[B](这里存在A->B这样一条边)。以此类推,从源点到终点的边数最多就为n-1条(因为无环,且结点数为n),所以最多做n-1次就能保证一定能得到从源点到终点的最短路径,当然这个时候从源点到各个结点的最短路径都求出来了。权值为负则表示政府的补贴超过了支出的运输成本,实际表现为运输过程中还能赚取一定的收益。
2024-09-27 23:58:12
937
原创 代码随想录算法训练营第58天 | 1、软件构建,2、参加科学大会
某个大型软件项目的构建系统拥有 N 个文件,文件编号从 0 到 N - 1,在这些文件中,某些文件依赖于其他文件的内容,这意味着如果文件 A 依赖于文件 B,则必须在处理文件 A 之前处理文件 B (0 <= A, B <= N - 1)。而拆分的依据与结点间的先后顺序有关,实际应用比如学习课程的先后顺序,做一件事的先后顺序,拓扑图如果能排序,那图中的每个结点所代表的事件一定存在一个先后的逻辑,我们要做的就是将这样的一个顺序找出来。输出共一行,如果能处理成功,则输出文件顺序,用空格隔开。
2024-09-27 22:11:03
853
原创 代码随想录算法训练营第57天 | 寻宝
在世界的某个区域,有一些分散的神秘岛屿,每个岛屿上都有一种珍稀的资源或者宝藏。国王打算在这些岛屿上建公路,方便运输。不同岛屿之间,路途距离不同,国王希望你可以规划建公路的方案,如何可以以最短的总公路距离将 所有岛屿联通起来(注意:这是一个无向图)。给定一张地图,其中包括了所有的岛屿,以及它们之间的距离。以最小化公路建设长度,确保可以链接到所有岛屿。第一行包含两个整数V 和 E,V代表顶点数,E代表边数。顶点编号是从1到V。例如:V=2,一个有两个顶点,分别是1和2。
2024-09-27 00:59:18
476
原创 代码随想录算法训练营第56天 | 1、冗余连接,2、冗余连接II
该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。输入一个有向图,该图由一个有着 n 个节点(节点编号 从 1 到 n),n 条边,请返回一条可以删除的边,使得删除该条边之后该有向图可以被当作一颗有向树。图中的 1 2,2 3,1 3 等三条边在删除后都能使原图变为一棵合法的树。这里需要注意在结点入度为2的时候,添加边的时候,遍历顺序是从后往前,这样能保证vec里面的第一个编号是标准输入的相对最后的一条边。输出一条可以删除的边,若有多条边可以删除,请输出标准输入中最后出现的一条边。
2024-09-27 00:04:24
1087
原创 代码随想录算法训练营第55天 | 寻找存在的路径
find函数负责找到每个结点的根,这里涉及到了路径压缩,也就是可能某个结点距离它的根很远,但是在最后递归找到后,直接将根的值返回,保存在了该结点的parent里面,这样就将路径压缩短了;正是因为有了路径压缩,所以一般来说,并查集的时间复杂度是O(logn)到O(1)之间的,刚开始可能是O(logn),但是随着规模越来越大,路径不断被压缩,最终查找的效率就会趋近于O(1)。如果存在,输出 1;实现的方式呢就是使用一个parent数组来保存节点之间的联系,就好像一棵二叉树一样,结点之间是有联系的。
2024-09-26 12:05:19
443
原创 代码随想录算法训练营第53天 | 1、字符串接龙,2、有向图的完全可达性,3、岛屿的周长
第二种是统计所有的陆地数量以及所有的相邻陆地数量,所有陆地的周长单独算的话周长等于陆地数量*4,但是每个陆地不是独立的,所以每存在相邻的两个陆地,那么周长就要减去2,所以最终的周长就等于陆地数量*4-相邻陆地数量*2。思路:这里判断字符串接龙,每次只能变换一个元素的值,然后到下一个字符串,所以就是找从beginStr字符串开始到endStr字符串的最短路径长度。深搜如果是处理下一个节点的情况,那么就没有了结束条件的判断,因为在循环中就给出了判断条件,如果不满足条件是不会进入递归的。
2024-09-26 11:21:43
932
原创 代码随想录算法训练营第52天 | 1、孤岛的总面积,2、沉没孤岛,3、水流问题,4、建造最大岛屿
思路:这里和第1题孤岛总面积的思路是相似的,将和四周边界相关的岛屿置为2或者其他数字,然循环遍历,将孤岛置为0,将之前变为2或者其他数字的岛屿重新置为1,最后打印输出即可。思路:这里所求的孤岛是指不和四周边界有关系的岛屿,所以这里可以采用深搜或者广搜来将和四周边界相关的岛屿置为0,也就是变为水域,这样再进行深搜或者广搜,记录孤岛总面积即可。所以我们这里尝试将本来的岛屿标上号码,并且记录好每块区域的大小,这样当遍历到水域时,查看它四周的方向,取四个方向上能构成岛屿最大的即可,不断更新最终结果,最后返回。
2024-09-26 09:21:45
672
原创 代码随想录算法训练营第51天 | 岛屿数量、岛屿的最大面积
给定一个由 1(陆地)和 0(水)组成的矩阵,计算岛屿的最大面积。岛屿面积的计算方式为组成岛屿的陆地的总数。给定一个由 1(陆地)和 0(水)组成的矩阵,你需要计算岛屿的数量。后续 N 行,每行包含 M 个数字,数字为 1 或者 0,表示岛屿的单元格。这里的深搜没有单独写终止条件,因为在循环里面用if判断过了,不满足情况是不会进入递归的,所以保证了其能够终止。使用广度搜索需要注意标记的时候是在加入队列的时候就要标记,而不是在从队列里面取出来过后才标记,否则会出错。输出一个整数,表示岛屿的最大面积。
2024-09-20 02:44:19
505
原创 代码随想录算法训练营第49天 | LeetCode42.接雨水、 LeetCode84.柱状图中的最大矩形
给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。思路:接雨水的问题是单调栈中比较经典的问题,这里分为三种思路来讲解。
2024-09-17 19:30:16
606
原创 代码随想录算法训练营第48天 | LeetCode739.每日温度、 LeetCode496.下一个更大元素I、 LeetCode503.下一个更大元素II
给定一个整数数组,表示每天的温度,返回一个数组answer,其中answer[i]是指对于第i天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用0来代替。思路:这里涉及到了单调栈的问题。当我们遇到要求某个元素最左边或者最右边第一个大于或小于该元素的值时,就可以考虑使用单调栈。单调栈的本质就是拿空间换时间,使用一个栈来记录之前已经遍历过的元素,这样可以依据已经遍历过的元素来做出判断,得出结果。所以它的时间复杂度通常是O(n)。单调栈又分为递增栈和递减栈。
2024-09-16 18:02:43
981
原创 代码随想录算法训练营第46天 | LeetCode647.回文子串、 LeetCode516.最长回文子序列
给你一个字符串s,请你统计并返回这个字符串中的数目。是正着读和倒过来读一样的字符串。是字符串中的由连续字符组成的一个序列。思路:在回溯系列也做过求给定字符串的所有回文子串,那里求的是所有的划分结果,这里统计的是回文子串的数目,但是因为回溯本质上是暴力求解,是在没有其他办法的情况下使用的一种方法,复杂度很大,呈指数级别,所以这里不采用回溯。这里采用动态规划和双指针两种方法讲解。
2024-09-14 20:28:18
499
原创 代码随想录算法训练营第45天 | LeetCode115.不同的子序列、 LeetCode583.两个字符串的删除操作、LeetCode72.编辑距离
第三种是替换,之前说元素相等的时候dp[i][j]=dp[i-1][j-1],当元素不相等的时候,不需要删除或者插入元素,而是将不相等的元素换成相等的元素,这样以i-1结尾的字符串word1就能和以j-1结尾的字符串word2相等了,这时操作次数为1,所以这里dp[i][j]=dp[i-1][j-1]+1。而对于当s[i-1]不等于t[j-1]时,那就不可能有s[i-1]去匹配的情况发生,所以就只剩下dp[i-1][j],也就是之前的记录状态,所以这时dp[i][j]=dp[i-1][j]。
2024-09-13 20:27:56
761
原创 代码随想录算法训练营第44天 | LeetCode1143.最长公共子序列、 LeetCode1035.不相交的线、LeetCode53.最大子数组和、LeetCode392.判断子序列
给定两个字符串text1和text2,返回这两个字符串的最长的长度。如果不存在,返回0。一个字符串的是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。"ace""abcde""aec""abcde"两个字符串的是这两个字符串所共同拥有的子序列。思路:昨天讲了一个,求的是连续的子序列。而这道题求的是最长公共子序列,也就是说序列是非连续的。
2024-09-12 17:13:47
1111
原创 代码随想录算法训练营第43天 | LeetCode300.最长递增子序列、LeetCode674.最长连续递增子序列、LeetCode718.最长重复子数组
给你一个整数数组nums,找到其中最长严格递增子序列的长度。是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组的子序列。思路:最长递增子序列,这道题的难点在于如何能够处理不连续的,但是还是递增的序列。或者换句话说,如果递增子序列不是连续的,我如何能够找到这样一段满足题意得递增子序列,并在循环结束后,返回最大长度。
2024-09-11 18:13:07
1068
原创 代码随想录算法训练营第42天 | LeetCode188.买卖股票的最佳时机IV、LeetCode309.买卖股票的最佳时机含冷冻期、LeetCode714.买卖股票的最佳时机含手续费
给你一个整数数组prices和一个整数k,其中prices[i]是某支给定的股票在第i天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成k笔交易。也就是说,你最多可以买k次,卖k次。你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。思路:这道题和之前讲的很像,如果前面这道题仔细做了,那么这道题也简单。需要注意得是这里是可以买卖k次,也就是不止买卖2次了。没关系,照样可以做。
2024-09-10 19:21:21
998
原创 代码随想录算法训练营第41天 | LeetCode121.买卖股票的最佳时机、LeetCode122.买卖股票的最佳时机II、LeetCode123.买卖股票的最佳时机III
给定一个数组prices,它的第i个元素prices[i]表示一支给定股票第i天的价格。你只能选择买入这只股票,并选择在卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回0。思路:今天讲解股票系列问题。这里是需要从一个标记价格的天数范围内,先买入,再卖出,求最大利润是多少。这里介绍两种方法。
2024-09-09 18:06:44
998
原创 代码随想录算法训练营第39天 | LeetCode198.打家劫舍、LeetCode213.打家劫舍II、LeetCode337.打家劫舍III
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,。给定一个代表每个房屋存放金额的非负整数数组,计算你,一夜之内能够偷窃到的最高金额。思路:这里需要注意需要跳着偷,连着偷就会报警。那么其实每一次取还是不取还是有讲究的,需要记录前面的状态。因此很容易想到使用动归的方法。这里先介绍使用二维数组维护的情况。dp[i][0]表示不偷第i间房的最大价值,dp[i][1]表示偷第i间房的最大价值。
2024-09-07 20:01:48
989
原创 代码随想录算法训练营第38天 | LeetCode322.零钱兑换、LeetCode279.完全平方数、LeetCode139.单词拆分、56. 携带矿石资源
给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。计算并返回可以凑成总金额所需的。如果没有任何一种硬币组合能组成总金额,返回-1。你可以认为每种硬币的数量是无限的。思路:抽象一下,给定背包容量,求满足将背包装满时所需的最小物品数量。所以动态规划dp[j]的含义有了。
2024-09-06 20:55:55
690
原创 代码随想录算法训练营第37天 | 52. 携带研究材料、LeetCode518.零钱兑换II、LeetCode377.组合总和、57. 爬楼梯
这样像,当先遍历物品,比如有个数组为[1,5],amount为3,那么先遍历物品,就只会有{1,5}这个解,因为第二个物品(值为5)不可能出现在第一个物品(值为1)之前,所以最后求的就是组合数;第一点,两层循环不管是先遍历物品还是背包,都是可以的(当然仅限于纯粹的完全背包问题,后面一些问题在遍历顺序上还是有说法的,并不是两种都适用,因为融合了实际应用),这跟01背包只能先遍历物品,然后才能遍历背包不同;同时我们还可以知道,首先迈一步,再迈两步,与首先迈两步,再迈一步是不同的结果,所以这又是求排列的问题。
2024-09-05 20:50:39
834
原创 代码随想录算法训练营第36天 | LeetCode1049.最后一块石头的重量II、LeetCode494.目标和、LeetCode474.一和零
有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。每一回合,从中选出,然后将它们一起粉碎。假设石头的重量分别为x和y,且x <= y。x == yx!= yxyy-x最后,石头。返回此石头。如果没有石头剩下,就返回0。思路:这里是给定背包容量,求尽可能将背包容量装满,看最多能装多少。同样这里将stones[i]元素的大小作为元素所占空间(容量的大小)以及所拥有价值的大小。之前其实讲过类似的一道题,,在里面我分析过如何求解。
2024-09-04 21:04:04
1104
原创 代码随想录算法训练营第35天 | 46. 携带研究材料、LeetCode416.分割等和子集
于是我们知道dp[j]的最大容量就是j,最多也就能装j大小的物品,也就是说dp[j]<=j,因为我们将nums[i]的大小既当作了所占空间大小,也将其作为了物品价值,dp[j]能装的也就只能到顶就是j的大小,在求和过程中可能存在比j大的值,也就是说dp[j]有大于j的值,但是因为本身容量就是j,没有办法将多余j的装进来,所以这部分我们是不管的,只需要初始化dp[target + 1]的大小即可。这里的初始赋值都为0,因为价值都为正数,只要有价值,那么该位置的dp值就不会被初始值0所覆盖,所以是合理的。
2024-09-03 19:32:01
834
原创 代码随想录算法训练营第34天 | LeetCode62.不同路径、LeetCode63.不同路径II、LeetCode343.整数拆分、LeetCode96.不同的二叉搜索树
一个机器人位于一个m x n网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?思路:这种每次只能向右或者向下走一步,最后到达指定位置的题目特别像二叉树从头节点到叶子结点,然后问你有多少种到达方法,采用二叉树求头节点到叶子结点的路径数就是这道题从某个其实点到终点的路径数,但是如果使用二叉树进行递归,时间复杂度太大,是2的指数级别,因此不建议使用,会超限。
2024-09-02 21:24:58
741
原创 代码随想录算法训练营第32天 | LeetCode509.斐波那契数列、LeetCode70.爬楼梯、LeetCode746.使用最小花费爬楼梯
(通常用F(n)表示)形成的序列称为。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(n) = F(n - 1) + F(n - 2),其中 n > 1给定n,请计算F(n)。思路:斐波那契数列这个问题比较简单,状态转换方程给出了,并且初始化的值也给出,所以比较简单。
2024-08-31 19:14:10
987
原创 代码随想录算法训练营第31天 | LeetCode56.合并区间、LeetCode738.单调递增的数字、LeetCode968.监控二叉树
以数组intervals表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。思路:这到题和昨天讲的三道题思路很像,如果昨天的搞明白了,那么其实这道题非常简单了。关键点在与重叠区间如何处理。首先我们知道需要排序,下面是按照区间的起始坐标从小到大的排序。可以在区间里面更新,也可以在最终答案里面更新。
2024-08-30 19:44:52
1070
原创 代码随想录算法训练营第30天 | LeetCode452.用最少数量的箭引爆气球、LeetCode435.无重叠区间、LeetCode73.划分字母区间
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组points,其中表示水平直径在xstart和xend之间的气球。你不知道气球的确切 y 坐标。一支弓箭可以沿着 x 轴从不同点地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为startend, 且满足end,则该气球会被。可以射出的弓箭的数量。弓箭一旦被射出之后,可以无限地前进。给你一个数组points返回引爆所有气球所必须射出的弓箭数。思路:这里涉及到对进行处理。
2024-08-29 17:59:24
912
原创 代码随想录算法训练营第29天 | LeetCode134.加油站、LeetCode135.分发糖果、LeetCode860.柠檬水找零、LeetCode406.根据身高重建队列
在一条环路上有n个加油站,其中第i个加油站有汽油gas[i]升。你有一辆油箱容量无限的的汽车,从第i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组gas和cost,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回-1。如果存在解,则它是的。思路:对于加油站的问题,这里给出了三种解决方法,暴力法,全局最优以及贪心算法。
2024-08-28 20:18:08
1143
原创 代码随想录算法训练营第28天 | LeetCode122.买卖股票的最佳时机II、LeetCode55.跳跃游戏、LeetCode55.跳跃游戏II、LeetCode1005.K次取反后最大化的数组和
给你一个整数数组prices,其中prices[i]表示某支股票第i天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候只能持有股票。你也可以先购买,然后在出售。返回你能获得的利润。思路:一般来说,就是遇到最小值购入,最大值抛出,然后循环往复。但是其实不用算整体,,看是正还是负。这里有两种方法,贪心算法和动态规划。
2024-08-27 19:02:06
818
原创 代码随想录算法训练营第27天 | LeetCode455.分发饼干、LeetCode376.摆动序列、LeetCode53.最大子数组和
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j]。如果,我们可以将这个饼干j分配给孩子i,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。思路:这里的分发饼干用到了贪心算法思想。涉及到贪心,那就需要先搞明白,。
2024-08-26 15:46:58
1174
原创 代码随想录算法训练营第25天 | 力扣491.非递减子序列、力扣46.全排列、力扣.全排列II、力扣332.重新安排行程、力扣51.N皇后、力扣37.解数独
所以加上为了避免死循环这个要求,终点站可以采用一个map数组,map是自动有序的,map中存放的是终点站,以及起点到终点的次数,这样当为0的时候也就是说走完了,不会再进入,从而避免了死循环。当然,如果说不存在解,也不会有无限递归的情况,因为如果1~9放在某个位置都不合适,会直接返回false,跳出一层递归,回溯,进行下面的操作。思路:这道题相较于上面的题目就是多了重复的数字,其实跟之前的组合去重思路一样的,先排序,再使用used数组判断同层元素是否重复,重复就跳过,不重复就入循环。
2024-08-24 22:58:36
773
原创 代码随想录算法训练营第24天 | LeetCode93.复原IP地址、LeetCode78.子集、LeetCode90.子集II
思路:这道题和之前做的切割字符串的思路是一致的,在主循环中判断是否满足题意,满意才能将其添加入path中,不满足题意直接可以终止本层循环,跳出递归。第二种是使用used数组记录元素使用情况,同样也是当前面元素使用完成后,回溯后,来到下一个重复元素时能够跳过,否则就会重复。第三种是在递归每层时,设置一个set集合,将使用过的元素都放里面,如果在同层找到了相同的重复元素,就跳过,continue。同时,这里不再有判断返回的语句,因为本身到达数组最后时,循环进不去,自然本层递归也就返回了,可以不用再写判断了。
2024-08-23 17:03:29
924
原创 代码随想录算法训练营第23天 | LeetCode39.组合总和、LeetCode40.组合总和II、LeetCode131.分割回文串
当两值相等时,如果used[i]==true,说明它们是在同一组解里面,只要不超过target,就能加入试试;而两值相等,used[i]==false时,说明前面和它相等的元素的解已经找完了,递归跳出来了,开始尝试递归它了,此时就不能进入循环,而是应该continue,否则递归下去必然就会出现重复解。从第一个元素分割开始,当是回文串的时候,就加入path,当进入递归时,下标要加1,分割位置也从找到第一个回文串的地方开始设置,后面只要找到了回文串,就将它加入path,并且继续递归,那什么时候停止呢?
2024-08-22 16:44:54
603
原创 代码随想录算法训练营第22天 | LeetCode77.组合、LeetCode216.组合总和III、LeetCode17.电话号码的字母组合
给定两个整数n和k,返回范围[1, n]中所有可能的k个数的组合。你可以按返回答案。思路:关于组合、切割、子集、排列、棋盘等类的问题,一般的处理方法就是。回溯并不是一个高效的解决办法,是一个暴力解法,但是有的问题只能使用回溯来解决,所以回溯的方法还是应该掌握。这里是给定一个区间,给出k个元素的组合,就可以使用回溯。在回溯里面,首先是对终止条件进行判断,然后一个for循环里面处理单层逻辑,期间有自身递归的调用,还有回溯操作。
2024-08-21 14:45:39
530
原创 代码随想录算法训练营第21天 | LeetCode669.修剪二叉搜索树、LeetCode108.将有序数组转化为二叉搜索树、LeetCode538.把二叉搜索树转换为累加树
给你二叉搜索树的根节点root,同时给定最小边界low和最大边界high。通过修剪二叉搜索树,使得所有节点的值在中。修剪树改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。可以证明,存在。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。思路:这里利用二叉搜索树本身的有序性这个特性,将不再区间范围内的元素去除,最后便能返回最终结果。
2024-08-20 15:51:50
844
原创 代码随想录算法训练营第20天 | LeetCode235.二叉搜索树的最近公共祖先、LeetCode701.二叉搜索树中的插入操作、LeetCode450.删除二叉搜索树中的结点
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(思路:之前已经讲过二叉树如何求给定两个结点的最近公共祖先, 对于二叉搜索树来说是通用的,但是二叉搜索树本身是有序的,我们可以根据有序这一特性来进行求解。这里大体分为和。
2024-08-19 16:12:21
924
原创 代码随想录算法训练营第18天 | LeetCode530.二叉搜索树的最小绝对差、LeetCode501.二叉搜索树中的众数、LeetCode236.二叉树的最近公共祖先
给你一个二叉搜索树的根节点root,返回。差值是一个正数,其数值等于两值之差的绝对值。思路:之前讲过类似的二叉搜索树的题目,解决方法的关键在于抓住其有序的特性,这里介绍两种方法,和。
2024-08-17 15:33:14
1150
原创 代码随想录算法训练营第17天 | LeetCode654.最大二叉树、LeetCode617.合并二叉树、LeetCode700.二叉搜索树中的搜索、LeetCode98.验证二叉搜索树
给定一个不重复的整数数组nums。可以用下面的算法从numsnums返回 nums构建的最大二叉树。思路:这道题和之前做过的使用中序和后序遍历求二叉树的题目一样,首先是确定分割索引,然后将所给数组序列分割成左右两部分,再使用递归,生成左右子树。这里给出两种方法,一种是,一种是使用。整体来说还是比较简单的,因为之前的文章也详细分析过。
2024-08-16 17:09:47
794
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人