自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 锅巴的JavaScript进阶修炼日记2:面向对象编程/原型及原型链

bind和call与apply相比,又有细微的不同了,bind和call传参的方式是完全一模一样的,区别在于call是直接调用函数,bind是作为一个返回值返回一个函数,然后你才能去调用这个新函数。因为 new 的结果是一个新对象,所以在模拟实现的时候,我们也要建立一个新对象,假设这个对象叫 obj,因为 obj 会具有 Person 构造函数里的属性,我们可以使用。bind还有一个特点,就是当 bind 返回的函数作为构造函数的时候,bind 时指定的 this 值会失效,但传入的参数依然生效。

2026-01-29 18:50:52 488

原创 锅巴的JavaScript进阶修炼日记1:this指针/闭包/作用域

但是当我们删除person的name属性以后,再去读取,此时person对象找不到name属性了,就会自动从person的原型,也就是person.__proto__,即Person.prototype中去查找,结果就为我们一开始赋值的guoba。JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。上文讲到,当查找变量时,会先从上下文的变量对象中查找,如果没有找到,就会从父级执行上下文的变量对象中查找,一直找到全局上下文的变量对象,也就是全局对象。

2026-01-29 13:57:57 794

原创 代码随想录算法训练营第四十五天:孤岛的总面积,沉没孤岛,高山流水,建造最大工岛

本题的暴力解法是将每一个0改成1,但是其实我们只需要用一次dfs把每个岛屿的面积记录下来就好,然后遍历所有0的方格(把0变成1),然后统计该1(0变成的1)周边岛屿面具,将相邻面积加起来,遍历所有0之后,就可以得到一个选一个0变成1之后的最大面积。我们可以先从第一组边界上的节点逆流而上,将遍历过的节点全部标记上,然后再从第二组边界出发,进行同样的操作,双方都标记过的节点就是既可以流向第一组边界又可以流向第二组边界的节点。现在你需要计算所有孤岛的总面积,岛屿面积的计算方式为组成岛屿的陆地的总数。

2025-12-28 20:20:09 856

原创 代码随想录算法训练营第四十四天:孤岛计数(广搜版),孤岛计数(深搜版),最大岛屿的面积

如果遇到了标记过的陆地节点和海洋节点就直接跳过,这样计数器就是最终岛屿的数量,所以我们本题标记所有陆地节点能遍历到的陆地的方式就可以选择dfs和bfs了。dfs:两种写法,要么dfs处理当前节点的相邻节点,即主函数遇到岛屿就计数为1,由dfs来处理接下来的相邻陆地。还有一种写法是dfs处理当前节点,即主函数遇到岛屿计数为0,dfs处理的是接下来全部的陆地。岛屿面积的计算方式为组成岛屿的陆地的总数。本题还是dfs与bfs的基础类题目,就是去搜索每个岛屿上‘1’的数量,然后取一个最大的。

2025-12-25 20:26:47 441

原创 代码随想录算法训练营第四十三天:可达路径

今天正式开始图论章节的更新,这段时间的所有题目都来源于卡码网,这是为了练习acm输入方式,没错,图论的所有题都将会是以acm输入输出方式编写,因为图的输入和输出在面试中是非常重要的环节,习惯了力扣的核心代码输出方式,面试官让你手撕就傻了眼了。本题我们会有n 个节点,因为节点标号是从1开始的,为了节点标号和下标对齐,我们申请 n + 1 * n + 1 这么大的二维数组。输出所有的可达路径,路径中所有节点的后面跟一个空格,每条路径独占一行,存在多条路径,路径输出的顺序可任意。

2025-12-24 20:24:21 338

原创 代码随想录算法训练营第四十二天:接雨水,柱状图中最大的矩形

重中之重还是当前高度大于栈顶高度的情况,因为此时就出现凹槽了,我们先弹出栈顶,将其记录为mid,如果弹出后栈不为空(说明左边还有更高的柱子),我们获取新的栈顶(左边更高的柱子),用left记录。假设数组本身就是从小到大的,例如【2,4,6,8】,那么入栈以后直接就满足递减了,根本走不到计算结果的逻辑,全程没有计算,最后返回的答案也只能是我们初始化的res = 0.本题的解法与上一题解雨水是相呼应的,接雨水是要找当前柱子左右两边第一个高于该柱子高度的柱子,而本题是找左右两边第一个低于该柱子高度的柱子。

2025-12-24 18:04:55 646

原创 代码随想录算法训练营第四十一天:每日温度,下一个更大元素I,下一个更大元素II

那么单调栈的使用还是必不可少的,从栈头到栈底的顺序,依旧是从小到大,即栈里的元素保持递增顺序,这是为了找到右边第一个比自己大的元素。我们要把重点放在当前遍历元素大于栈顶元素的情况上,因为此时入栈就不满足递增栈了,我们要先判断栈顶元素有没有在nums1里面出现过(栈里的元素是nums2里的元素),如果出现过再开始记录结果,然后弹出栈顶元素,更新栈顶元素索引直到当前元素小于栈顶元素为止,与上一题如出一辙,就是多了一个判断是否出现在nums1的步骤。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。

2025-12-22 21:29:57 829

原创 代码随想录算法训练营第四十天:回文子串,最长回文字序列,动态规划完结

4.确定遍历顺序:依旧是从下到上,从左到右的顺序遍历,而且要注意第二个for循环中j是要从i + 1开始遍历的,如果从i开始遍历不仅会和上面初始化的部分重复,还有可能导致边界越界,因为我们要计算dp[i][j] = dp[i + 1][j - 1] + 2,如果i等于j,那就变成了访问的是。我们在判断字符串S是否是回文,那么如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。

2025-12-21 19:58:54 496

原创 代码随想录算法训练营第三十九天:不同的子序列,两个字符串的删除操作,编辑距离

如果word1[i - 1] 与 word2[j - 1]不相同,那就看看word1[0, i - 2]与word2[0, j - 1]的最长公共子序列 和 word1[0, i - 1]与word2[0, j - 2]的最长公共子序列,取最大的。而当后者出现,也就是s[i - 1] 与 t[j - 1]不相等时,dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j],所以递推公式为:dp[i][j] = dp[i - 1][j];

2025-12-20 21:09:28 942

原创 代码随想录算法训练营第三十八天:最长公共子序列,不相交的线,最大子序和,判断子序列

= t[j - 1]了,我们就只考虑删除t字符,因为t的长度大于s,不可能删s的字符的,而所谓的删除其实就是比较i - 1 和 j - 2,也就是dp[i][j] = dp[i][j - 1](因为dp[i][j]分别对应下标i - 1和下标j - 1结尾)3.dp数组的初始化:由于dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

2025-12-18 19:43:03 1038

原创 代码随想录算法训练营第三十七天:最长递增子序列,最长连续递增数列,最长重复子序列

连续递增的子序列 可以由两个下标 l 和 r(l < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;根据dp[i][j]的定义,dp[i][j]的状态只能由dp[i - 1][j - 1]推导出来。

2025-12-17 20:09:01 464

原创 代码随想录算法训练营第三十六天:买卖股票的最佳时机IV,买卖股票的最佳时机含冷冻期,买卖股票的最佳时机含手续费

也可以是昨天持有股票,今天卖掉了,那么现在手里的现金就能加上今天股票的卖价,但是注意还得扣掉手续费(此处是与“122.买卖股票的最佳时机II”唯一有差别的点),即dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);要么i-1 天没持有股票,今天把股票买进来了,那现在的现金就得扣掉今天的股票价格,所以:dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);所以只单独讲解递推公式部分。

2025-12-16 21:24:58 728

原创 代码随想录算法训练营第三十五天:股票买卖的最佳时机,股票买卖的最佳时机II,股票买卖的最佳时机III

如果第i天没持有股票,即dp[i][1],要么前一天就已经把股票抛了(dp[i - 1][1]),要么今天把股票抛了,也就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]。所以dp[4][4]已经包含了dp[4][2]的情况。如果第i天持有股票,即dp[i][0],那么可以从两个状态推出来:要么是前一天就持有了(dp[i - 1][0]),要么是今天买入了,手里现金就是昨天不持有股票的现金 减去 今天的股票价格:dp[i - 1][1] - prices[i]

2025-12-15 21:26:04 968

原创 代码随想录算法训练营第三十四天:打家劫舍,打家劫舍II,打家劫舍III

1.确定递归函数的参数及其返回值:传入的参数就是当前节点,我们要返回偷或者不偷的金钱,也就是说我们要返回一个长度为2的数组,下标为0记录着不偷得到的最大金额,下标为1记录着偷该节点得到的最大金额。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。我们还是要讨论抢不抢当前房子,本题就是抢不抢当前节点,如果抢了就不能抢左右孩子了,如果没抢没抢当前节点,就去考虑是否要抢左右孩子了(不是一定抢)

2025-12-14 22:02:35 1059

原创 代码随想录算法训练营第三十三天:零钱兑换,完全平方数,单词拆分

2.确定递推公式:切割的范围是[j,i],我们要确保[j,i]切割出来是个单词,还得确保dp[j] === true(字符串前j个字符可以被拆分成单词),只有两个条件都满足,我们才把当前dp[i]修改为true,递推公式为:if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。2.确定递推公式:和上题保持一致:dp[j] = min(dp[j - coins[i]] + 1, dp[j]),原因都是一样一样的,把钱币替换成完全平方数就是了。

2025-12-13 21:57:50 1042

原创 代码随想录算法训练营第三十二天:零钱兑换II,组合综合IV,爬楼梯(进阶版)

01背包递推公式为:dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]),01背包如果放了物品i,再取就只能拿物品0到物品i - 1这个范围了,物品i拿不了。因为本题本质和元素凑成的顺序没多大关系,本题描述也是求组合数。而完全背包公式为:dp[i][j] = max(dp[i - 1][j], dp[i][j - weight[i]] + value[i]),因为有无限个物品,我拿完物品i下一次还是能从物品0到物品i的区间里拿。

2025-12-12 20:28:27 1480

原创 代码随想录算法训练营第三十一天:最后一块石头的重量II,目标和,一和零

其他满足题意但较小的子集包括 {"0001","1"} 和 {"10","1","0"}。2.确定递归公式:dp[i][j]可以由前一个strs里的字符串推导出来,假设strs的字符串中有x个0,y个1,那么dp[i][j]就可以是dp[i - x][j - y] + 1,我们在遍历过程中要不断对比dp[i][j]和这个式子,因为我们要取得是最大值。3.dp数组的初始化,因为没有重量为负数的石头,所以全部初始化为0,在01背包的一维dp数组中,如果有负数是要单独初始化为负无穷的,后面会碰到。

2025-12-11 22:31:41 893

原创 代码随想录算法训练营第三十天:背包问题(二维,滚动数组),分割等和子集

题目描述:小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。

2025-12-10 19:31:45 658

原创 代码随想录算法训练营第二十九天:不同路径,不同路径II

2.确定递推公式:就像昨天做过的“爬楼梯”,想到达终点,就得去想想前面两步,本题要到达dp[i][j],很自然就能往dp[i - 1][j] 和 dp[i][j - 1]这两个方向推导,回忆一下上一步,这俩分别指代从(0, 0)的位置到(i - 1, j)有几条路径,以及从(0, 0)的位置到(i , j - 1)有几条路径。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。网格中的障碍物和空位置分别用 1 和 0 来表示。

2025-12-08 20:11:29 763

原创 代码随想录算法训练营第二十八天:斐波那契数,爬楼梯,使用最小花费爬楼梯

一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);2.确定递推公式:从上面的例子可以得出,想得到dp[i]必须先得到dp[i - 1]和dp[i - 2],因为dp[i -1]跳一个台阶就是dp[i],dp[i -2]跳两个台阶就是dp[i],所以这俩玩意包含了所有到达第i阶最后一步的方法,没有别的最后一步方式了(只能跳一步或者两步)。所以dp[i] = dp[i - 1] + dp[i - 2]。

2025-12-07 19:24:33 1105

原创 代码随想录算法训练营第二十七天:合并区间,单调递增的数字

其实不算难,因为左边界一定是ntervals[i - 1],我们排过序的,所以我们并不需要将这两个区间删去,合并,再添加,这样太麻烦了。所以我们在这里用了一个巧妙的解法,在循环外面先定义一个变量flag初始化为strNum.length,如果遇到strNum[i] > strNum[i + 1]了,我们给flag赋值为strNum[i + 1],我们可以再写第二层循环,让flag及以后的数字全部变成9,而且flag初始化的这个值也有讲究,这是为了防止flag一直没被赋值的情况还去执行第二个for循环的。

2025-12-06 18:16:42 816

原创 代码随想录算法训练营第二十六天:用最少数量的箭引爆气球,无重叠区间,划分字母区间

很简单,只要当前区间的左边界大于等于上一个区间的右边界,我们就让计数器自增一次,并且更新右边界为当前区间的右边界,重复下去,计数器就是我们最多能保留的不重叠区间数。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。我们按照气球起始位置排序,如果当前遍历区间的左边界大于上一个区间的右边界了,那就说明没重合,就得加一只弓箭,然后更新右边界为当前遍历区间的右边界(表示这只新箭能覆盖的最右位置)如何用最少的箭,那肯定就是我们尽量射重叠的气球,所以本题的局部最优:当气球出现重叠,一起射,所用弓箭最少。

2025-12-04 21:57:43 514

原创 代码随想录算法训练营第二十五天:加油站,分发糖果,柠檬水找零,根据身高重建队列

这次的for循环就得从rating.length - 2 开始了,因为要比较rating[i]和rating[i + 1]了,如果rating[i]>rating[i + 1]了,现在我们就有两个选择了,一个是保留当前的candies[i]不变,另一种是给candies[i]赋值为candies[ i + 1] + 1,为什么这里就不直接写candies[ i + 1] + 1了呢?那么按照我们的代码逻辑,区间和1已经小于0了,那我们就要从区间和1的下一个索引开始,那不就是从区间和2开始吗。

2025-12-04 18:48:23 1489

原创 代码随想录算法训练营第二十四天:买卖股票的最佳时机II,跳跃游戏,跳跃游戏II,K次取反后最大化的数组和

不好评价贪心算法,每一道题感觉都完全不搭架,卡哥说主要还是锻炼我们的贪心思考方式(局部最优,全局最优),我明天的博客会给这两点加上的,现在做起来确实有点随缘的意思,今天的跳跃游戏II真是上强度,剩下三题就很简单,跟玩一样就过去了。我们有k次随意翻转数组中任意元素的机会,那么很容易就想到本题的第一个贪心(是的,本题有两个贪心),为了最后得到的和最大,我肯定优先把绝对值大的负数翻转成正数,最好能将所有负数都翻转成正数。贪心的思路就是,当前可移动距离,能走多远走多远,直到走到最大范围为止。

2025-12-02 21:51:39 1097

原创 代码随想录算法训练营第二十三天:分发饼干,摆动序列,最大子序和

而且也不用担心加了一个-1,万一4就是最大连续和怎么办,我们定义了一个res,每次遍历都会实时比较res和连续和,只有出现更大的连续和时,我们的res才会更新,比如上图res就没有变成3,而是保持为4,res一直都会是当前遍历过的最大连续和,最后直接返回res即可。并且每块饼干 j,都有一个尺寸 s[j]。贪心算法的第一天,这玩意真是没什么规律可言,不像前两章有什么递归三部曲,回溯三部曲,今天这三题完全八杆子打不着,有些题可能写出来了都没意识到我用的其实是贪心算法,真是诡异,明天继续,今天没啥太难的题。

2025-12-01 22:48:44 1005

原创 代码随想录算法训练营第二十二天:递增子数列,全排列,全排列II

先确认传入参数,res数组在外面储存结果,传入nums(题目给出),route(当前遍历过的路径),这题是目前这么多题中唯一不需要startIndex的题,如上图1已经在最左边用过了,但还是得在中间和右边继续使用,而startIndex是用来排除用过的元素防止重复的,在这里就多余了,但是纵向遍历又不能重复使用刚刚用过的元素了,所以我们再次使用set去处理,这个放在下面详细展开。二者存在很明显的差异,你能明显看到树层去重效率更高,树枝去重做了太多不必要的遍历了,这也是为什么它的效率远不如树层去重。

2025-11-30 22:43:43 1300

原创 代码随想录算法训练营第二十一天:复原ip地址,子集,子集II

题目描述:给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。例如:"0.1.2.201" 和 "192.168.1.1" 是 有效的 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是 无效的 IP 地址。

2025-11-28 22:26:41 1128

原创 代码随想录算法训练营第二十天:组合总和,组合总和II,分割回文串

那么就直接来回溯三部曲吧,首先来确定传入的参数和返回值,还是得在递归函数外面定义一个全局变量res用于储存最终的结果,然后本题递归函数需要传入五个参数:candidates,target(题目给出,一个是参数,一个是目标值),startIndex(老朋友了,确定从哪里开始搜索),route(当前遍历的路径,也就是正在构筑的组合),sum(当前路径数字的总和),依旧无需返回值。然后再递归处理剩余部分,也就是从i+1开始递归,最后回溯,也就是移除刚才添加的子串,继续尝试下一个可能的分割位置。

2025-11-27 22:14:56 935

原创 代码随想录算法训练营第十九天:组合,组合综合III,电话号码的字母组合

首先来确定函数参数,依旧定义一个res数组用来存储所有可能的字母组合,回溯函数的参数有三个,分别是:digits(输入的数字字符串),curIndex(当前处理的数字索引),route(已选择的字母序列),这里的Index就和前面两题不一样了,前面指代搜索的起始数字,而这里是记录我们遍历到第几个数字了,是用来遍历digits的(题目给的数字字符串)。这题跟上题的区别其实不大,就两点,一个是本题就相当于在[1,2,3,4,5,6,7,8,9]这个数组中找k个数,二个是这k个数的和得是n,选取过程如图;

2025-11-26 22:33:38 958

原创 代码随想录算法训练营第十八天:修剪二叉搜索树,将有序数组转换为二叉搜索树,把二叉搜索树转换为累加树,二叉树完结(历时八天)

而且每一道题的递归都是不一样的恶心,我自己对递归最大的感触就是你得把图画出来一步一步往下推,用心去感受递归的每一步,为啥这里这么递归,还有就是前中后序遍历的选择,这也是重要的一个点,不是说随便拿一个用就行。题目要求是从最大的开始逐步累加到最小的,我们平时最常用来遍历二叉搜索树的方式是中序遍历(左中右),把它从小到大排列,那么我们稍微灵活思考一下,如果我们反转中序遍历,也就是又中左遍历,那不就变成从大到小排列了吗,至于累加肯定不算难点啊,之前使用我们在“二叉搜索树中的众数”中的双指针技巧不就行了。

2025-11-25 20:02:19 1248

原创 代码随想录算法训练营第十七天:二叉搜索树的最近公共祖先,二叉搜索树中的插入操作,删除二叉搜索树中的节点

上题我们通过取巧的思路,没有改变树的结构,但是这题跑不掉了,删除操作基本上都回改变树的结构,本题一共有五种情况:1.没找到删除的节点,遍历到了空节点就直接返回 2.要删除的是叶子节点,直接返回null就算删除了 3.删除节点的左孩子为空,右孩子不为空,用右孩子代替当前的节点 4.删除节点的右孩子为空,左孩子不为空,用左孩子代替当前节点 5.左右节点都不为空,将伤处节点的值替换为右子树最小值节点的值,在右子树中递归删除那个最小值节点。返回二叉搜索树(有可能被更新)的根节点的引用。如果找到了,删除它。

2025-11-24 23:45:04 1080

原创 代码随想录算法训练营第十六天:二叉搜索树的最小绝对差,二叉搜索树中的众数,二叉树的最近公共祖先

但是还有一个问题需要我们解决,二叉搜索树中的众数可能不止一个,我们要返回的可是一个数组而非一个数,如果是在数组中,我们可以先遍历第一遍数组找到最大频率,再遍历第二遍数组将所有最大频率的元素拖出来,加入结果数组中。就像上一题我们提到过的,只要遇到二叉搜索树这个有序的二叉树,那么我们就可以往中序遍历上想了,将它变成一个有序的单调递增数组处理的话,啥问题都不算难题,比如这题找众数,我们很容易联想到使用map,key储存元素,value储存出现次数,轻松搞定。如果当前遍历的节点为空,我们就可以终止递归了。

2025-11-23 21:11:54 1210

原创 代码随想录算法训练营第十五天:最大二叉树,合并二叉树,二叉搜索树中的搜索,验证二叉搜索树

654.最大二叉树文章讲解/视频讲解题目描述: 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:通过给定的数组构建最大二叉树,并且输出这个树的根节点。示例 :提示:给定的数组的大小在 [1, 1000] 之间。思路:最大二叉树的构建过程如下:构建二叉树一定是前序遍历,也就是先根节点,再左子树,最后右子树的顺序构建,这道题就很像昨天那道“从中序与后序遍历序列构造二叉树”,如出一辙的找根节点然后切割。那就继续递归三部曲,先来确定传入的参数和返回值,本题参数传入的是存放元素的数组,左边界,

2025-11-22 22:46:23 1250

原创 代码随想录算法训练营第十四天:找树左下角的值,路径总和,从中序与后序遍历序列构造二叉树

最后在看单次递归的逻辑,首先我们先获取根节点的值(把后续遍历数组的最后一个数直接弹出),再把根节点的值放到中序遍历的数组中进行匹配,去找中序遍历数组中根节点的下标,这个下标的值其实就是左子树的节点数,然后我们创建根节点,开始递归构建左右子树。本题的核心就围绕着这棵树的根节点展开,题目给了我们中序遍历和后序遍历,由于后序遍历的顺序是左右中,所以后续遍历的最后一个一定就是这棵树的根节点,我们就可以用这个根节点将左右中的中序遍历切开,再根据中序数组,反过来再切后序数组。)加入到结果数组中。

2025-11-22 14:25:26 1348

原创 代码随想录算法训练营第十三天:平衡二叉树,二叉树的所有路径,左叶子之和,完全二叉树的节点个数

然后是确定递归的终止条件,一般我们的终止条件都是当前节点为空就终止,但是这题不一样,本题我们要找的是叶子节点,到叶子节点终止递归,也就是我们要找到左右孩子都为null的节点才终止递归。今天四道题又是对递归的深化理解,说实话递归真不好想,基本上每道题都得写个例子一步一步往下推才能直观的想明白递归的逻辑,你们在写递归除了我们每道题都用上的递归三部曲,画图也是一个帮助你们理解的重要技能,对着代码看半天不如五分画个图一步一步推下来,思路立马就清晰了,二叉树真是望不到头啊,明天依旧是二叉树,我会快快的更新博客的。

2025-11-20 21:53:02 878

原创 代码随想录算法训练营第十二天:翻转二叉树,对称二叉树,二叉树的最大深度,二叉树的最小深度

226.翻转二叉树视频讲解/文章讲解题目描述:翻转一棵二叉树。思路:这个翻转看起来贼复杂啊,但是其实就是把每一个节点的左右孩子进行交换,就这么简单,这里可以用我们昨天学到的递归遍历,在遍历的过程中去翻转每一个节点的左右孩子即可达到整体翻转的效果。,下面我们以前序遍历为例,先看一段动画来理解一下翻转的过程:先设定递归的“出口”,如果当前遍历到的节点是null,就没必要再进行任何操作,直接返回null然后我们先定义一个临时变量 rightNode,这是用来储存当前右子节点的,下一步我们就要修改右子节点了,如果不

2025-11-19 21:30:12 819

原创 代码随想录算法训练营第十一天:二叉树递归遍历,二叉树层序遍历(笔记日)

1.确定递归函数的参数与返回值:我们要打印出前序遍历节点的参数,所以参数里我们放root,我们不需要做其他处理也不需要返回值,所以留空即可,只写一个root。2.确定终止条件:这里我们用的是深度优先搜索,即一条路走到黑,所以这里递归结束的标志就是当前遍历的节点为空了,如果当前遍历节点为空,直接return。3.确定单层递归的逻辑:前序遍历是中左右的逻辑,所以先取中节点数值,再递归遍历左子树,最后递归遍历右子树。完成任务2之后,你不是重新开始,而是回到任务一,继续完成你没做完的节点3,即遍历右子树。

2025-11-17 22:47:10 297

原创 代码随想录算法训练营第十天:逆波兰表达式求值,滑动窗口最大值,前K个高频元素,栈与队列完结

写完上面的入队与出队函数,接下来就更好解决了,我们先定义左指针 i 与右指针 j 以及单调队列和结果数组,再把前k个元素用入队函数加入单调队列中,记录此时窗口的最大值并存入答案数组中,接着滑动窗口处理剩余元素,不断让新元素(j)入队,旧元素(i)出队,记录窗口最大值,移动窗口(i++,j++),循环执行这几步操作直到 j 不小于 nums.length为止,最后返回我们的答案数组,也就是所有窗口的最大值数组即可。给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。

2025-11-16 22:50:32 1210

原创 代码随想录算法训练营第九天:用栈实现队列,用队列实现栈,有效的括号,删除字符串中所有相邻重复项

本题一个是要想明白到底何时才返回false,初见很容易被给出的例子吓到,以为存在数不清的情况,最终进入思维迷宫一直绕圈,但是如果想明白了其实只存在三种false情况,对应的代码实现起来就很简单了,难的在于直观思维是去寻找匹配的括号,但是实际写法却是寻找期望的括号,这是一种反直觉的写法,碰上左括号压入的却是右括号。本题的难点就在于思维模式的转化,想明白如何用两个先进后出,转化成一个先进先出,即栈的反转。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

2025-11-15 21:40:46 661

原创 代码随想录算法训练营第八天:翻转字符串里的单词,右旋转字符串,字符串完结,双指针法总结

以“hello ”(末尾有空格)为例,当fast = 5 时,它发现是空格,但前一个字符是‘o’(并非空格),所以保留这个空格,fast和slow同时++(fast和slow变成6),循环结束,现在:h e l l o [空格] (索引0-5),slow = 6(指向下一个写入的位置)。先来删除开始位置和重复的空格(两个及以上的空格只保留一个),判断条件是“如果当前是空格,并且是字符串的开头或者前一个字符也是空格(即连续空格),就跳过这个空格”,否则就将当前字符复制到慢指针,两个指针同时往前移动一步。

2025-11-13 20:22:36 2074

空空如也

空空如也

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

TA关注的人

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