
LeetCode75题解
文章平均质量分 59
LeetCode75题解
折途想要敲代码
这个作者很懒,什么都没留下…
展开
-
【LeetCode75】第七十三题 用最少数量的箭引爆气球
我们在遇到不重叠的区间的时候,所需用的箭+1,并且直接将右端点更新成新的区间的右端点。所以我们的做法和上一题基本一致,只不过由于我们要让尽可能多的区间重叠才可以用最少的箭来引爆所有气球。本题和上一题基本一样,上一题是要我们尽量让区间不重叠,而本题是要我们尽量让区间重叠。并且跟上一题不一样的是,我们起码要用一根箭,所以答案初始化为1。因此我们一样是对区间进行排序,按照 左端从小到大的顺序。在遇到重叠区间的时候我们就将右端点更新为较小值。接着是拿一个变量去接收最小的右端。原创 2023-10-18 11:58:22 · 128 阅读 · 0 评论 -
【LeetCode75】第七十一题 搜索推荐系统
那么跟前缀有关的题目我们都可以使用前缀树来完成,先用产品数组构建出前缀树,接着按照每次输入进去的字符串对前缀树进行搜索,把搜索到的有相同前缀的字符串中的前三个字典序较小的添加进答案中。给我们一个产品数组,以及一个字符串,我们模拟依次输入字符串中的每一个字符,要求返回与对应的输入字符串拥有相同前缀的产品,每次只输出前三个字典序较小的产品。我个人不太喜欢在刷题的时候额外建一个新的类(因为我懒)。最后对输入遍历完毕我们就获取到了模拟输入产生的效果了。再我们对输入字符串遍历,来模拟输入的字符串。原创 2023-10-12 12:39:33 · 120 阅读 · 0 评论 -
【LeetCode75】第六十七题 比特位计数
题目给我们一个整数n,要我们返回一个长度为n+1的数组,数组的第 i 位元素是 整数 i 的二进制数拥有的1的数目。例如 10 的二进制是 1010,所以10拥有的1的数目是2。第二种方法就是我们直接手算。我们可以从一个数的二进制的右边第一位开始统计1的数目。如果一个数余2等于1,那么它的右边第一位就是1。所以我们可以反复对这个数余2再除2,直到这个数变成了0,那么我们也就统计出了1的数目。那么我们直接从0遍历到n+1,再单独算出这个数拥有的1的数目就可以了。原创 2023-10-08 17:50:35 · 97 阅读 · 0 评论 -
【LeetCode75】第六十六题 编辑距离
如果用的是插入操作,那么就等于是字符串1的长度多了一节,但是我们没法在dp数组里体现出来,那我们换一个思路,我对字符串1进行插入操作,是不是就等于是我跳过了比较字符串2的第 j 个字符。首先如果字符串1的第 i 个字符等于字符串2的第 j 个字符,那么它们的最小操作次数就应该等于dp[ i - 1 ][ j - 1],也就是不用操作。假设两个字符不一样,我用的是删除操作,那么就等于是让字符串1的长度少了一节,也就是说操作次数应该是dp[ i - 1 ][ j ] + 1。那么重点是如果字符不一样呢。原创 2023-10-07 16:09:58 · 106 阅读 · 0 评论 -
【LeetCode75】第六十四题 最长公共子序列
如果字符串1的第 i 个字符和字符串2的第 j 个字符一致,那么就是说当字符串1的长度等于 i 和字符串2的长度等于 j 时的最长公共子序列的长度等于 当字符串1的长度等于 i - 1 和字符串2的长度等于 j -1 时的最长公共子序列的长度+1。那么他们此时的最长公共子序列的长度就等于字符串1的长度等于 i - 1 且字符串2的长度等于 j 时和字符串1的长度等于 i 且字符串2的长度等于 j - 1 时的最长公共子序列。而这对字符出现之前的最长公共子序列又是又按照顺序出现的字符一致的对数决定的。原创 2023-09-27 13:38:02 · 81 阅读 · 0 评论 -
【LeetCode75】第六十三题 不同路径
那么我们知道地图中行号为0的是地图矩阵的最上面的一条边,列号为0的是地图矩阵最左边的一条边。而走到本格的上格的方法也是只有两种,那就是本格的上格的上格以及本格的上格的左格。而走到本格的左格也是一样的。那么我们知道走到某格子只能从上面和左边来,所以dp[ i ][ j ] = dp[ i -1 ][ j ] + dp [ i ][ j - 1 ]这个意思就是走到某格子的方法数等于走到本格上面的方法数以及走到本格左边的方法数。dp[ i ][ j ]的含义就是我们走到地图的 i 行 j 列有几种方法。原创 2023-09-24 10:30:56 · 121 阅读 · 0 评论 -
【LeetCode75】第六十一题 打家劫舍
我们看这个递推公式,含义就是有i间房屋的情况下,我能获取的最多金额等于 在有i–1间房屋的情况下能获取到的最大金额 和 在有i–2间房屋的情况下能获取到的最大金额再加上第i间房屋的金额 的最大值。如果有三间屋子,那么可以开始操作了,那我就可以选择偷或者是不偷第三间屋子了,如果偷,那么我就不能偷第二间屋子,我能偷的金额就是只有一间屋子的时候能偷的金额再加上第三间屋子的金额。我们要明确的点是dp里的元素是什么意思,下标为i–1的元素就是表示只有i间房子的情况下我们能获取的最多的数。原创 2023-09-22 18:00:27 · 80 阅读 · 0 评论 -
【LeetCode75】第五十三题 猜数字大小
题目就是让我们猜数字,要猜中的数字为1~n,并且给我们提供一个api,传入一个数字表示是我们猜的数,api会告诉我们是猜大了还是猜小了,如果我们猜大了会返回-1,猜小了会返回1,猜对了就会返回0,我们再将猜中的数字返回。如果从1开始猜到n,那么是会超时的,那么这道题是经典的二分查找题,所以我们使用二分查找法来做,使用二分查找法我们可以每次都排除一半的数,也就是说不管数字多大,我们都最多只需要猜㏒₂n次,这样就不会超时了。原创 2023-09-12 13:09:50 · 86 阅读 · 0 评论 -
【LeetCode75】第四十九题 数组中的第K个最大元素
另外一个就是使用大顶堆,C++里有内置,是叫priority_queue优先队列,我们只需要往优先队列里塞进元素,那么这个容器底层会自动对元素进行排序,我们从大顶堆里取的数永远是队列里最大的数,那么我们只需要取数,再将大顶堆的堆顶元素移出,如此反复k-1次,那么最后取出的数就是数组里第K大的元素了。那么很直观的一个做法就是我们直接对数组进行降序排序,索引为k-1的元素就是整个数组里第k大的元素了。题目很简单,就是给我们一个数组,让我们返回第K大的元素。原创 2023-09-07 18:57:09 · 152 阅读 · 0 评论 -
【LeetCode75】第四十八题 腐烂的橘子
不过有几个需要注意的小细节,不能直接把腐烂橘子周围的新鲜橘子变成腐烂橘子,因为如果直接传染了,那么往后遍历就会遍历到本轮腐烂的橘子,就会再将这个腐烂橘子的周围再变腐烂,这样就无法区分是本来就是腐烂橘子还是本轮被传染的腐烂橘子,导致答案要么是0,要么是-1,要么是1。我们只需要在每次传染的时候记录下新鲜橘子的数量,如果本次传染前和上次传染时的新鲜橘子数量一致,那么就说明上次传染根本就没有使任何一个新鲜橘子腐烂,所以是永远都没有办法让所有橘子变腐烂,这时候返回-1即可。原创 2023-09-06 13:11:52 · 111 阅读 · 0 评论 -
【LeetCode75】第四十四题 省份数量
首先是先找出他们各自的源头,再把其中一个的源头的源头改成对方的源头。其中找出各自源头这一步是不断寻找源头列表里对应位置,如果一个城市的源头不是自己,那么我们就接着找这个城市的源头的源头,直到找到源头是自己的城市,那么这座城市就是我们需要寻找的城市的最终源头。按照我自己的话来说,并查集就是给将相连的元素都设置一个共同的源头,在本题中,我们让相连的城市都有一个共同的源头,那么最后我们统计一下所有城市一共有多少个不同的源头即可确定是有多少个城市了。并且需要将每个城市的源头初始化成自己。原创 2023-09-02 09:43:53 · 705 阅读 · 0 评论 -
【LeetCode75】第二十九题 删除链表的中间节点
我们需要定义两个指针来遍历这个链表,其中一个快指针比慢指针每次多走一次,如果快指针走到了链表末尾,那么就没有环。我们可以直接遍历这个链表,最后能走到链表末尾也就是空指针那就代表这个链表没有环,如果一直死循环在走,那么就说明我们陷入环了。为了实现删除节点的效果,我们让慢指针的上一个节点的后驱指向慢指针的下一个节点,直接跳过慢指针就达到了删除指针的效果。然后我们用的方法是快慢指针,我们知道,快指针走的路是慢指针的两倍,因此如果快指针走到了链表末尾,那么慢指针所在的位置就是链表的正中间。原创 2023-08-15 08:02:26 · 611 阅读 · 1 评论 -
【LeetCode75】第七十四题 每日温度
我们把元素依次和栈顶元素对比,如果比栈顶元素更小,我们就接着入栈,直到遇到了比栈顶元素更大的值,我们就将栈顶元素出栈,并且就算是找了第一个比栈顶元素更大的值,这一过程一直重复,直到这个元素小于新的栈顶元素了,我们再接着把这个元素入栈。题目给我们一个数组,表示每天的温度,要我们返回一个同样长度的数组,答案里装着当前气温的下一个更高气温的距离天数。也就是找到数组中这个数的下一个更大的数,答案填入他们的距离。我们入栈的是数组的下标,这样就可以计算出下一个更大数的距离了,并且我们也可以通过下标来获取到对应的值。原创 2023-10-19 13:55:36 · 137 阅读 · 0 评论 -
【LeetCode75】第二十八题(649)Dota2参议院
首先我们先明确一点,什么是最好的决策。最好的决策就是把下一个离自己最近的其他阵营的参议员干掉,这样在本轮中,敌方阵营就会少掉一次干掉本方阵营的机会,如果往后没有敌对阵营了,那么就把数组开始的第一个敌方阵营的参议员干掉。给一个数组表示一个参议员,按照从左到右的顺序开始行使权利,权利就是可以禁止另一个参议员的权利。假设每个参议员都会做出最好的决策。求,在最后,还会剩下哪一个阵营的参议员。能理解最好决策之后,写代码就是体力活了,可以参考下面的代码。那么这道题可以直接模拟,我们就模拟他们参议员行使权利。原创 2023-08-14 09:09:38 · 168 阅读 · 0 评论 -
【LeetCode75】第七十二题 无重叠区间
每当有区间的左端小于这个最右端时,我们就需要移除一个区间了,具体是移除哪一个呢,我们不需要知道,我们只知道我们这个最右端越小,那么下次需要移除的概率就越小,因此我们只需要判断,当前的区间的右端如果比最右端更小,那么我们就更新最右端为较小的值。题目给我们一个二维数组,里面的每个数组都表示一段区间,我们可以删除任意区间,问我们最少需要删除多少区间才可以使所有区间都不重叠。我们如何判断两个区间有重叠呢,如果一个区间的左端大于另一个区间的左端并且小于其右端,那么就是有重叠了。原创 2023-10-13 11:42:29 · 87 阅读 · 0 评论 -
【LeetCode75】第七十题 实现前缀树
那么我们可以发现这棵数有两个节点是颜色不一样的,这是什么含义呢,这就意味着存储在前缀树的字符串中有以这根节点开头,以这个节点结尾的字符串。和查找字符串不同的是,查找前缀不需要查看结尾的节点是否有结尾标记,因为只是前缀,所以能一路找到前缀的最后即可,不需要知道存放在前缀树里的这个字符串是不是一个完整的字符串。我们注意到这棵前缀树的节点没有值,只有子树数组和一个是否结尾的标记,那是因为我们本题中只需要判断是否有某字符串存储在内以及是否有某前缀在内,因此是可以省略的。再以示例1为例,最终的前缀树实际上是这样的。原创 2023-10-11 09:25:12 · 101 阅读 · 0 评论 -
【LeetCode75】第六十九题 或运算的最小翻转次数
因为 a,b,c 为 int 类型,所以每个数都是32位,因此我们上述操作需要重复32次,放到一个 for 循环里执行。题目给我们 a,b,c 三个数,我们可以对 a 和 b 的二进制形态中的任何一位做翻转,问我们最少翻转几次之后可以让 a 位或 b 等于 c。如果 c 为 1 ,那么 a 和 b 至少得有一个1,我们就判断,如果 a 和 b 都为0的情况下我们将翻转数加1。而如果c为 0,那么 a 和 b 必须都为0,所以 a 和 b 每有一个1,我们的翻转数都必须加1。最终把翻转数返回出去即可。原创 2023-10-10 20:19:56 · 143 阅读 · 0 评论 -
【LeetCode75】第六十八题 只出现一次的数字
那么我们只需要把数组的所有数都一起做异或操作,因为相同的数被抵消成0了,所以最后的结果就是数组中只出现一次的数了。那我们直接拿一个map来记录一下就好啦,不过题目要求只使用常量额外空间,那就不能这么做了。这道题只要明白原理,那么其实是很简单的一道题。原理就是相同的数做异或操作的结果是0。题目给我们一个数组,让我们返回只出现一次的数字。其他还有没有什么方法呢?原创 2023-10-09 17:31:36 · 85 阅读 · 0 评论 -
【LeetCode75】第六十五题买卖股票的最佳时机含手续费
而我第 i 天持有股票时能拥有的最多收益是我第 i - 1天持有股票时能拥有的最多收益或者是我第 i - 1天没有持有股票时的最多收益再扣除第 i 天的股票价格,因为我第 i - 1 天没有股票的话,我在第 i 天有股票那就只能是在第 i 天买入股票。dp[ 0 ][ 0 ]的含义就是在第0天我持有股票时拥有的最多利润,那么第0天我要持有股票,那么只能是在第0天就买了股票,所以dp[ 0 ][ 0 ]初始化成负的第0天的股票价格。我们规定dp[ 0 ][ i ]存放的是第 i 天持有股票时拥有的最多收益。原创 2023-09-28 16:15:51 · 116 阅读 · 0 评论 -
【LeetCode75】第六十二题 多米诺和托米诺平铺
我们压缩一下,发现n=5时也是可以由前面几种方案延伸出来的,并且同样是有两个奇怪的方案无法由其他情况的方案延伸出来。其他都是n=3,n=2,n=1时的延伸,而且n=1时的延伸有两种。因为托米诺有一些特殊,它只能和托米诺配合才可以填满矩阵,也就是说不管n是多少,方案里的托米诺的数量一定是偶数的。除了两个开头有点奇怪的方案,其他的都是n=2时的方案加一块多米诺,或者是n=1时的方案加两块多米诺。也就是说n=1和n=2时的方案是没什么参考性的,我们直接看n=3和n=4时的方案。问我们有多少种平铺方案。原创 2023-09-23 10:34:54 · 171 阅读 · 0 评论 -
【LeetCode75】第六十题 使用最小花费爬楼梯
由于我们一开始说了,我们最终需要到达的台阶是n+1层,所以dp数组的长度就应该是n+1而不是n。关于dp数组的初始化,我们一开始也说了,只有从台阶起步,我们才会需要花费,因为我们在0或1节台阶上的花费都是0,直接初始化这俩为0就可以开始递推了。我们每次可以跨1~2节台阶,所以如果我们要走到第k节台阶,则有两种选择,一种是从k-1节台阶跨一节台阶,或者是从k-2节台阶跨两节台阶上来。花费分别是 到达k-1节台阶的花费+cost[ k-1 ] , 到达k-2节台阶的花费+cost [ k - 2 ]原创 2023-09-21 10:02:28 · 97 阅读 · 0 评论 -
【LeetCode75】第五十九题 第N个泰波那契数
并且递推公式人家题目都给了,就是前三个数的和,而且最开始的三个数也给了。我们就直接初始化dp数组的前三个数,然后开始用递推公式递推出第K个泰波那契数即可。题目顾名思义,让我们求出第N个泰波那契数,也就是除了开头三个数之外,第四个数开始就是等于前三个数之和。也就是说当前数,我们可以通过之前的数来推断出,也就是可以使用动态规划。斐波那契是前两个数的和,泰波那契是前三个数的和。不要和斐波那契数弄混了。原创 2023-09-19 16:53:14 · 80 阅读 · 0 评论 -
【LeetCode75】第五十六题 爱吃香蕉的珂珂
我们每次取范围的中间数当作速度,看看按照这个速度吃完的时间有没有超过h,如果没有超过,那么就说明我们还有可能可以再慢一些,那么我们收缩右范围来使得范围的中位数变小。珂珂可以自己控制自己吃香蕉的速度,也就是每小时可以吃几根香蕉,不过同一个小时只会待在同一个仓库里,也就是所就算吃完了一个仓库的香蕉,并且一小时里还有剩余时间,它也不会跑去其他仓库吃。如果把速度定成所有仓库里最多的香蕉数,那么吃完吃需要仓库数量的时间,也是至少要花的时间,因为你速度再提高也不会减少花费的时间。最终我们就可以把范围缩小到答案。原创 2023-09-15 07:25:01 · 112 阅读 · 0 评论 -
【LeetCode75】第五十八题 组合总和Ⅲ
那么由于我们能用的元素是固定且有序的,那么我们可以给递归函数传递我们本次递归要用到的元素,从1开始传递,每次进入下一轮递归就+1再传过去,直到递归到了10,那么根据题目要求,我们是不能使用10以上的数字的,那么我们就停止递归。另外递归要传的参数还有临时的排列数组,如果递归的时候发现临时排列数组的长度为k了,并且总和等于n了,那么我们就加入到答案列表里,然后结束递归。为了减少重复计算,我们也可以把临时数组里的元素总和也当作参数传给递归函数,这样就不用每次判断总和是否等于n的时候还要遍历临时数组算一边。原创 2023-09-18 12:30:44 · 81 阅读 · 0 评论 -
【LeetCode75】第五十七题 电话号码的字母组合
递归,那我们肯定是需要知道人家按下的按键是什么,所以要把按下的按键传给递归函数,其次我需要知道我递归到第几轮了,那这个是依据什么呢,依据就是我这次遍历轮到我按下的按键中的具体哪一个按键了,所以还需要一个下标指针,用来表示我们现在递归到哪一个按键了。我们一共按下多少按钮生成的所有排列组合是不是长度都是按下的按钮数,所以当我们表示下标的那个参数等于按钮数了,那是不是就等于是说我把按钮都按过了,那么就是下标大于等于按钮数组的长度了或者是临时排列组合的长度等于按钮数了,那么这个时候我就终止递归。原创 2023-09-17 09:33:46 · 109 阅读 · 0 评论 -
【LeetCode75】第五十五题 寻找峰值
那么我们和中间数右边的一个数做比较,如果中间数比右边的数大,那么是不是峰值就是会存在与中间数的左边(包括中间数)。而如果中间数比右边的数更小,那么峰值就是存在与中间数的右边(不包括中间数)。有小伙伴可能会疑惑,二分查找不是要求数组有序吗,而且二分查找一般是用来查找特定的值的,而我们这题中都不知道具体的值是多少,这该怎么二分查找?那二分查找的精髓实际上的每次都排除一半的范围,因为整个数组存在峰值,所以整个数组是局部有序的,我们可以通过二分查找来逐渐锁定范围,直到范围只包括了一个数,那么这个数就是答案。原创 2023-09-14 12:39:37 · 107 阅读 · 0 评论 -
【LeetCode75】第五十四题 咒语和药水的成功对数
我们把咒语降序排序,然后再遍历咒语,在遍历咒语的时候拿一个指针来遍历升序的药水数组,如果当前咒语和药水的乘积大于特定值了,那么该咒语能匹配的药水数量就是药水数组的长度减去当前遍历到的药水下标值,这个和刚才的没有什么区别,区别在于我们用一个指针保存了药水的遍历情况,轮到下一个咒语时,我们接着刚才的药水位置接着遍历直到乘积再次大于特定值即可。题目给我们两个数组,要我们找出第一个数组中每个元素能和另一个数组的元素匹配的数量。匹配的条件是乘积大于特定的值。原创 2023-09-13 12:32:57 · 178 阅读 · 1 评论 -
【LeetCode75】第五十二题 雇佣K位工人的总代价
我们每次取数的时候都对比一下左边的小顶堆和右边的小顶堆,哪边的堆顶元素更小我们就取哪边,同时再加入一个元素去保持小顶堆的长度为c,也就是能获取到前c个最小的元素的一个状态,并且要保证左右的小顶堆不会包含重复的元素,这个只需要分别用左右两个指针来控制左右顶堆添加元素的操作就可以,只要左右指针不重叠,那么就不会取到相同的元素。给我们一个数组表示第i个元素表示雇佣第i个工人所需花费的代价,一共要雇佣K位工人,每次都从数组的开头c个或是结尾c个里挑出一个所需花费的代价最小的工人,问我们所需花费的最小代价是多少。原创 2023-09-11 08:34:46 · 97 阅读 · 0 评论 -
【LeetCode75】第五十一题 最大子序列的分数
我们可以直接按照nums2递减的下标来获取nums1的元素,而不去管这个nums1的元素是多大多小,我们直接把元素塞进小顶堆里,然后累加到小顶堆内元素总和表示nums1子序列的元素中和,每次小顶堆大小超过K了,我们就吐出一个数,保证nums1的子序列长度为K,并将nums1子序列总和减去这个数,因为是小顶堆,所以每次吐出的数的整个小顶堆里最小的,那么我们留在小顶堆里的元素就是nums1里较大的元素了。另外题目还算是降低难度了,有保证数组的值都是非负数,所以我们不必考虑负数的情况。原创 2023-09-10 09:20:34 · 191 阅读 · 0 评论 -
【LeetCode75】第五十题 无限集中的最小数字
添加回无限集的时候就更简单了,我们直接寻找要添加的数在不在我们的set里,如果在,我们就把set里的这个数字移除来表示添加回无限集里,因为set里存放的是被移出无限集的数,这样可能有点绕,大家结合着下面的代码再捋一捋。并且我们使用set来存放,这样每次移除最小数的时候,我们从1开始寻找set,如果数字不在set里,那么我们就把数字加入到set里来表示这个数被我们移除了。设计的这个类有两个调用函数,一个让我们将无限集中最小的数移出并返回,另一个函数让我们再将一个不在无限集里的数添加会无限集里。原创 2023-09-09 09:54:18 · 153 阅读 · 0 评论 -
【LeetCode75】第四十七题 迷宫中离入口最近的出口
那么这道题可以使用DFS也可以BFS,不过DFS是暴力解法,需要把所有能走的路都走一边,所以会超时,因此我们只能使用BFS,BFS虽然也是暴力解法,不过我们要找的是最短路径,所以使用BFS一找到出口就可以直接返回路径长度,不需要把所有路都走一遍,所以比DFS要更快。每次我们都将队列里的地点取出,接着向四个方向辐射,如果为墙则跳过,如果不为墙就判断一下是否为出口,为出口就直接把队列里取出的路径+1返回接口。首先是将入口入队,入队的同时需要将地图中的入口位置置为墙,和上面DFS一样,为了避免重复 走同一条路。原创 2023-09-05 13:15:13 · 210 阅读 · 0 评论 -
【LeetCode75】第四十六题 除法求值
那最后的问题就是我们应该如何将未知数转变为另一个未知数,这里我们需要用到DFS,去寻找每一个和第一个未知数有关的倍数未知数,同时再从这些有关的倍数未知数里再去寻找和目标未知数有倍数关系的未知数,我们这边要注意的是,这样寻找绝对会重复寻找同一个未知数进而进入死循环,因此我们要用一个set来存放已经被我们查找过的未知数,如果查找过我们就不再重复去查找了。所以要解未知数等式,我们就需要寻找这两个位置共同拥有的一个未知数的倍数关系,例如一个a等于两个b,一个b等于三个c,那么一个a就等于6个c。原创 2023-09-04 17:40:24 · 107 阅读 · 0 评论 -
【LeetCode75】第四十五题 重新规划路线
那么实际上我们可以通过根节点遍历到一棵树的每一个节点,并且路线是唯一的,所以我们可以当作遍历一棵树一样,通过遍历0号城市来通向每个城市,在发现节点之间的指向不对时,将操作次数加一,再遍历完所有城市之后,即可获取所有操作次数。接着我们从0号城市开始遍历,首先遍历和0号城市相邻的城市,这边要注意不走回头路,否则会死循环,所以dfs中需要记录一下当前城市的上一个城市,也就是该城市通往0号城市的路上的第一个城市。遍历时我们看一下方向,如果方向是正确的,也就是向着0号城市的我们就不管,反之操作次数+1。原创 2023-09-03 09:31:39 · 230 阅读 · 0 评论 -
【LeetCode75】第四十三题 钥匙和房间
数组索引为0的位置里的元素就是我们能拿到的钥匙,可以开启对应房间号的门。接着我们开始递归,在递归里遍历0号房间的钥匙,如果钥匙对应的房间我们是之前就可以进入的,那么我们跳过这把钥匙,因为该房间我们现在或者是之前已经递归过了,为了剪枝,我们就跳过这把钥匙。如果钥匙对应的房间我们之前没有进入过,那么我们将一开始定义的那个数组中对应的位置置为true表示我们可以进入……再拿到这个房间里的钥匙,开始下一轮递归。首先我们先定义一个长度为房间数量的数组,元素类型为bool类型,用来表示我们能否进入到对应的房间。原创 2023-09-01 21:31:23 · 440 阅读 · 0 评论 -
【LeetCode75】第四十二题 删除二叉搜索数中的节点
我们可以知道目标节点的右子树上任意一个节点的值都比目标节点的左子树上任意一个节点的值更大,所以我们可以把目标节点的右子树接到目标节点的左子树的最大的节点的右子树上,再让目标节点的左子树顶替上原先目标节点的位置,这样就完成了删除目标节点的这样的操作。题目给我们一棵二叉搜索树,给我们一个目标值,让我们删除节点值等于目标值的节点,并且删除之后需要保持二叉搜索树的定义,也就是任意一个节点的左子树上的所有节点的值都小于该节点的值,右子树上的所有节点的值都大于该节点的值。都是满足二叉搜索树的定义。原创 2023-08-31 08:56:28 · 368 阅读 · 0 评论 -
【LeetCode75】第四十一题 二叉搜索树中的搜索
因此我们在遍历搜索二叉树的时候将当前节点的值和目标值做比较,如果值和当前节点的值相同,那么返回该节点。如果当前节点的值比目标值更小,那说明如果有值等于目标值的节点,那一定是在当前节点的右子树,所以此时我们应该向右子树移动。反之则向左子树移动。二叉搜索数的特性就是,每一个节点的左子树上所有节点的值都会比当前节点的值更小,而右子树上所有节点的值都会比当前节点的值更小。首先我们可以直接遍历整棵二叉树,找到值相同的节点就返回出去,不过这样就没有用到二叉搜索数的特性了。原创 2023-08-30 10:05:55 · 200 阅读 · 0 评论 -
【LeetCode75】第四十题 最大层内元素和
那这道题我们可以对层序遍历做一些小改变,因为我们最终要的是每层元素的总和,所以在层序遍历的时候我们不需要把每个元素都存起来,我们可以直接加到对应层数的元素总和里。那具体如何层序遍历我再上一题也详细介绍过了,没看过或是不懂怎么层序遍历的小伙伴可以点开我的主页找一下LeetCode75的第三十九题。这道题和LeetCode75的上一题大同小异,都是要我们对二叉树进行层序遍历。最后再比较一下每层的元素总和大小,把最大的那一层的层数返回出去就可以了。原创 2023-08-29 10:22:56 · 261 阅读 · 0 评论 -
【LeetCode75】第三十九题 二叉树的右视图
然后进入一个while循环,只要队列为空我们就退出循环,在循环体里我们先给存层序遍历的二维列表里塞一个空的一维列表,然后先记录一下队列的长度,然后再for循环队列长度次数,在for循环里再每次取出一个队列里的节点,把节点的值塞进二维数组的最后一个一维数组里面。这样就是每次我们只取二叉树的一层节点,并且存住每层的节点值后,还把每个节点的子节点塞进了队列,这样队列里就是下一层的节点了。首先是DFS深度优先搜索,我们先定义一个空的二维数组,是用来存放层序遍历的结果的。最终二维数组就是我们层序遍历的结果。原创 2023-08-28 00:18:53 · 328 阅读 · 0 评论 -
【LeetCode75】第三十八题 二叉树的最近公共祖先
这时候虽然当前节点也还是两个节点的公共祖先,但并不是最近的公共祖先,并且因为pq都在当前节点的某棵子树上(左子树或是右子树),那么它们的最近公共祖先必然是在当前节点的子树,所以在我们需要将当前节点向那棵子树上转移,直到出现上面第一第二种情况。因为pq已经各自分布在这个节点的左右两侧了,如果这个节点再往下走,不管是走哪个方向,都不可能再同时是它们两个节点的公共祖先了。所以我们在递归遍历二叉树的时候,一旦发现了pq分布在某个节点的左右两侧,或是直接遍历到了pq节点,那就将当前节点返回出去即可。原创 2023-08-27 08:20:57 · 312 阅读 · 0 评论 -
【LeetCode75】第三十七题 二叉树中的最长交错路径
这种二叉树类的题目我们是少不了递归遍历,这次递归我们需要携带参数去递归,就是记录我上一次是左拐还是右拐,然后每次遍历到新的节点我们都需要重新来以此节点作为路径的起始节点来递归。例如我上一次在二叉树里是右拐,那么接下来我的递归,如果是左走的话,我就把记录路径长度的参数+1然后再次递归,并且还需要多一层递归,那就是路径长度从0开始重新计算的一层递归。给我们一棵二叉树,问我们在这棵树里能找到的最长交错路径。最长交错路径就是在二叉树里一左一右一左一右这样走,最长能走的路径长度是多少。具体可以参考下面的代码。原创 2023-08-26 09:23:09 · 509 阅读 · 0 评论