自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录 完结撒花 60 天总结

如果满分为10分,我给我在这60天的表现打8分,扣除2分的原因在于,有时候不及时打卡,不认真思考,可能将打卡当做任务就完成了,心态不好。但是大体上,对于每天的学习内容完成度还是不错的,虽然很多AC了的题,再看还是陌生,但是知识就是学了忘,忘了学的过程,养成解题的思路以及做题的自律,是这60天我获得的最大收获。但是每次,在视频中听到,大家好,这里是代码随想录,我是程序员Carl,我就知道,这题稳了,从思想到代码实现都稳了。如果我在大三加入星球,那么我有信心进入大厂,可惜我现在研三。“编筐编篓,重在收口”。

2023-11-22 20:10:40 325 2

原创 代码随想录 10.14 || 二叉树 LeetCode 669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.将二叉搜索树转为累加树

1)cur->val 小于 left,当前节点应该被删除,但是根据二叉搜索树的性质,当前节点的右子树可能满足 cur->val 大于 left,即不能删除以当前节点为根的整棵二叉树,应该仅删除当前节点,还需要遍历其右子树;因此,根节点是中间的值,所以从有序数组的中间一分为二,左边初始化为左子树,右边初始化为右子树。2)cur-> val 大于 right,当前节点应该被删除,根据二叉搜索树的性质,当前节点的左子树可能满足 cur->val 小于 right,还需要遍历其左子树;

2023-11-22 19:29:38 65

原创 代码随想录 10.13 || 二叉树 LeetCode 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

回顾一下二叉树的定义,加固记忆。int val;

2023-11-21 21:08:47 266

原创 代码随想录 11.21 || 单调栈 LeetCode 84.柱状图中最大的矩形

4 号柱子对应的矩形面积为:2 * 4 = 8,这里有同学可能会产生疑问,在代码实现中,4 号柱子右边没有高度更小的柱子怎么办?根据上述思路发现,这是一个单调栈问题,在单调栈中以单调递减的顺序存储遍历过得元素。个非负整数,用来表示柱状图中各个柱子的高度。求在柱状图中,能够勾勒出来的矩形的最大面积。如图所示,图中的柱状图是根据 heights 数组生成的,求解柱状图中形成的矩形的最大面积。问题类似,我们求以每个柱子为基底所形成的矩形的面积,在所有的结果中取最大值。类似,在由数组组成的柱状图中,根据条件求解。

2023-11-21 11:41:40 49

原创 代码随想录 11.20 || 单调栈 LeetCode 503.下一个更大元素Ⅱ、42.接雨水

2 号柱子的高度为 0,容量为 1,其右边相邻更高的柱子为 3 号,高度为 2,左边相邻更高柱子为 1号,高度为 1。此时,1,2,3 号柱子形成一个凹槽,凹槽的容量为 1 号柱子(比 3 号柱子矮) - 2 号的高度,1 - 0 = 1,此时说的容量其实为高度,还需要求得宽度,宽度为右边柱子的索引 - 左边柱子的索引 - 1,3 - 1 - 1 = 1,所以 2 号柱子的容量为 1 * 1 = 1。很复杂,我只能说很复杂。每根柱子装水的容量,为以当前柱子为底,以两边最近的更高柱子为边形成的凹槽的容量。

2023-11-21 10:26:30 46

原创 代码随想录 11.18 || 单调栈 LeetCode 739.每日温度、496.下一个更大的元素Ⅰ

注意,当前访问的元素,可能比栈不止一个元素都大,即它可能是多个元素的右边第一个最大的元素,所以需要使用一个循环进行遍历。首先是暴力解法,居然通过了,嵌套三个循环,第一个循环用于在 nums1 中挑选元素,第二个循环用于在 nums2 中寻找给定元素的位置,第三个循环用于返回给定元素右起第一个更大的值。单调栈解法,nums1 是 nums2 的子集,那么只要找到 nums2 中所有元素右边第一个更大的元素的值,然后判断该元素在不在 nums1 中,如果在将这个更大的值添加进结果集即可。下面是精简过后的代码。

2023-11-19 13:26:50 89

原创 代码随想录 11.17 || 动态规划 LeetCode 647.回文子串、516.最长回文子序列

因此,定义 dp[i][j] 为在区间 [i, j] 最长回文子序列的长度。递推公式为,如果 s[i] == s[j],则 dp[i][j] = dp[i + 1][j - 1] + 2,当前区间内最长回文子序列的长度 = 前一个区间内最长回文子序列的长度 + 2;如果不满足相等条件,则 dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]),当前区间内最长回文子序列的长度取决于不考虑 i 或者 j 的字符子串内的最长回文子序列的长度。求回文字符串中,回文子串的数量。

2023-11-17 15:11:24 66

原创 代码随想录 11.16 || 动态规划 LeetCode 583.两个字符串的删除操作、72.编辑距离

当不满足上述条件时,dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1),因为我们可以在任意字符串中删除字符,所以选取删除操作最少的那个字符串 + 1;删除两个字符串中多余的字符,使得两个字符串相同,此时我们定义 dp[i][j] 为以 word1 中的 i - 1 为结尾 和以 word2 中的 j - 1 为结尾的字符串,其最少操作次数为 dp[i][j];按照 i 和 j 初始化 dp[i][0] 和 dp[0][j];

2023-11-16 19:55:02 150

原创 代码随想录 11.15 || 动态规划 LeetCode 392.判断子序列、115.不同的子序列

给定字符串 s 和 t,判断 s 是否为 t 的子序列。注意:子序列不要求连续,但是要求各个元素出现的前后顺序相同。的思路相同,如果字符串 s 和 t 的最长公共子序列的长度不等于字符串 s 的长度,就说明 s 不为 t 的子序列。,和 1143.最长公共子序列,

2023-11-15 11:28:48 37

原创 代码随想录 11.14 || 动态规划 LeetCode 1143.最长公共子序列、1035.不相交的线、53.最大子数组和

即当前两个字符串中对应的字符相同,公共子序列的长度等于前一个字符串处公共子序列的长度加 1。当不满足上述条件时,在当前字符处最长公共子序列的长度,应该等于在 text1 或 text2 中以前一个字符结尾的字符串对应的最长公共子序列的最大值。与上一题思路类似,区别在于递推公式,在数组 nums1 中的数字 nums1[i] 如果能与 nums[j] 相连接,当前 dp[i] 两种选择,连接和不连接,取最大值即可。本题与 718.最长重复子数组 的思路基本一样,都是求两个序列的重复字串。

2023-11-14 15:31:41 34

原创 代码随想录 11.13 || 动态规划 LeetCode 300.最长递增子序列、674.最长连续递增子序列、718.最长重复子数组

dp 数组初始化,根据我们对 dp 数组的定义,二维 dp 数组的第一行和第一列均无意义,因为 dp[1][1] 表示 nums1[0] 和 nums2[0] 是否相同,为第一个访问的元素对。dp[i][j] 的意义为,在 nums1 中以下标 i - 1为结尾的子数组,在 nums2 中以下标 j - 1 为结尾的子数组,二者公共的、最长的子数组的长度为 dp[i][j];dp[i] 的意义为,以 nums[i] 为尾元素的数组,其最长连续递增子序列的长度为 dp[i]。遍历顺序,从前向后;

2023-11-13 10:54:17 77

原创 代码随想录 11.11 || 动态规划 LeetCode 309.买卖股票的最佳时机含冷冻期、714.买卖股票的最佳时机含手续费

状态 1 能由状态 1、2、3 推导,不持有股票的前一天可能为不持有股票、卖出股票和冷冻期状态;在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一只股票):卖出股票后,你无法在第二天买入股票(即冷冻期为一天)。只要减去手续费即可,因为有手续费的存在,所以不交易可能比交易的获利更大,所以取 dp[len - 1][0] 和 dp[len - 1][1] 的最大值。3. 初始化,dp[0][0] = -prices[i],dp[0][1~3] = 0;5. 出错时,打印 dp 数组 debug。

2023-11-12 15:41:38 20

原创 代码随想录 11.10 || 动态规划 LeetCode 123.买卖股票的最佳时机Ⅲ、188.买卖股票的最佳时机Ⅳ

dp[i][1] 表示第 i 天为第一次持有(买入)状态,dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]),要么当天买入股票,要么继承自前一天的状态;dp[i][2] 表示第 i 天为第一次不持有(卖出)状态,dp[i][2] = max(dp[i-1][2], dp[i-1][1] - prices[i]),要么当天卖出股票,要么继承自前一天的状态;dp[i][3] 和 dp[i][4] 同理。一共有五种状态:当天不买不卖不持有,即无状态,不操作;

2023-11-11 13:16:47 20

原创 代码随想录 11.09 || 动态规划 LeetCode 121.买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ

2)递推公式,dp[i][0] = max(dp[i - 1][0], -prices[i]),在第 i 天,持股(买入)的状态要么等于前一天持股的状态,要么在第 i 天买入,产生的利润都是负利润,即买入股票的花费。dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]),在第 i 天,持股(卖出)的状态要么等于前一天的持股状态,要么在第 i 天卖出,产生的利润为当前股票价格 - 此前买入股票的花费利润,我们在 dp 数组中存储负数利润,因此此处为相加。

2023-11-10 11:06:25 21

原创 代码随想录 11.08 || 动态规划 LeetCode 198.打家劫舍、213.打家劫舍Ⅱ、337.打家劫舍Ⅲ

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,。给定一个代表每个房屋存放金额的非负整数数组,计算你,一夜之内能够偷窃到的最高金额。确定 dp[ j ] 的含义,在第 j 间房间最多能偷到 dp[ j ] 金额;确定递推公式,在第 j 间房间中偷取到的金额取决于 j - 1 和 j - 2 房间的状态,如果不偷 j 房间,则 dp[ j ] = dp [ j - 1 ];

2023-11-09 15:05:50 47

原创 代码随想录 11.06 + 11.07 || 动态规划 LeetCode 322.零钱兑换、279.完全平方数、139.单词拆分

2)确定递推公式:dp[ j ] = min(dp[ j - coins[ i ] ] + 1, dp[ j ]),将硬币的币值看作 物品的重量,将硬币的数量看作 物品的价值,该递推公式由 dp[ j ] = max(dp[ j - weight[ i ] ] + value[ i ], dp[ j ]) 推到而来,求最小的硬币个数,所以将 max 函数 更换为 min 函数。1)确定 dp 数组的含义:dp[ j ] 表示可以凑成总金额为 j 的最少的硬币个数为 dp[ j ];

2023-11-08 17:41:14 29

原创 代码随想录 11.04 || 动态规划 完全背包问题 LeetCode 518.零钱兑换Ⅱ、377.组合总和Ⅳ

本题要求返回 “可以凑成总金额的硬币组合数”,在回溯章节中我们知道,数字的组合表明数字之间没有顺序逻辑,只要构成组合的数字相同,即为相同的组合。在代码实现中,先遍历背包 or 物品都可以,注意遍历背包时,并非从后向前,而是从前向后,在 01背包问题中我们了解到,从前向后遍历会重复使用各个物品,这恰好符合完全背包的定义。2)递推公式,求组合的递推公式,基本都为 dp[j] += dp[j - nums[i]],在本题中,nums 数组为 coins 数组;求排列,外层循环遍历背包,内层循环遍历物品。

2023-11-06 13:48:16 30

原创 代码随想录 11.03 || 动态规划 01背包问题 LeetCode 1049.最后一块石头的重量Ⅱ、494.目标和、474.一零和

有一堆石头,用整数数组stones表示。其中stones[i]表示第i块石头的重量。从中选取任意两块石头,将它们一起粉碎。粉碎的结果为大石头与小石头的重量差,最后只会剩下一块石头,返回最后剩下石头的最小的可能重量。解题思路,将一堆石头分成两个子集,要求这两个子集的重量尽可能的相等(平分总重量),那么两个子集中的石头相撞,留下的那一块石头将会是最小的。很明显,这是一个动态规划的 01 背包问题,向背包中放入物品(石块),尽可能满足指定的背包价值(一半石块的总重量),需要注意的是,石块的重量既是重量也是价值。

2023-11-05 13:41:13 22

原创 代码随想录 11.02 || 动态规划 背包问题 二维 dp 数组 和 一维 dp 数组、LeetCode 416.分割等和子集

可以将二维的 dp 数组压缩至一维,回想我们对于 dp 数组的定义,在背包容量为 j 时,从物品 0 ~ i 中取物品,放置背包中,能得到的最大背包价值。就像台历一样,当前为 10 月,那么此前的状态肯定是 1 ~ 9 月,因为 10 月是根据 1 ~ 9 月的信息推导而来,即使没有显式地说明 1 ~ 9 月,但是你也一定知道,此前经历过了这些月份。其实,背包问题是经典的动态规划问题,因为当前背包中的物品价值是根据此前背包中的物品和当前物品决定的,存在对此前状态的继承与叠加,动态规划刚好可以解决这种问题。

2023-11-04 14:13:43 88

原创 代码随想录 11.01 || 动态规划 LeetCode 343.整数拆分、96.不同的二叉搜索树

就是求以 1 ~ n 这些个数,为根节点的二叉搜索树的可能组合,当选定的根节点为 i 时,此时该树的左子树有 i - 1 个节点(二叉搜索树要求左子树都小于根节点),右子树有 n - i 个节点,总共可能的组合有 (i - 1) * (n - i)。2):确定递推公式,给定某一个正整数 n,其能够拆分成 i + (n - i),乘积为 i * (n - i),其中 (n - i) 项可能允许进一步拆分,如何表示进一步拆分的 (n - i),即 dp[n - i]。返回 你可以获得的最大乘积。

2023-11-03 10:49:10 41

原创 代码随想录 10.31 || 动态规划 LeetCode 62.不同路径、63.不同路径Ⅱ

2)确定递推公式:机器人只能向下或向右走,针对某一个非边界位置,只有两种路径,方向上或左,递推公式为。与上一题的不同之处在于,存在障碍物阻挡,如果障碍物出现在边界,则包括障碍物和障碍物之后的。边界处的 路径总和 都为 1,其实可以将数组全初始化为 1,届时直接覆盖非边界条件元素的值即可。要求修改初始化 dp 数组的步骤,在遍历过程中,如果遇到障碍物,直接跳过即可。1)确定 dp 数组中下表的含义及对应元素的含义:在本题中,在位置。3)初始化 dp 数组:dp 数组中的特殊情况,到达。

2023-10-31 10:04:49 107

原创 代码随想录 10.30 || 动态规划 LeetCode 501.斐波那契数、70.爬楼梯、746.最小花费爬楼梯

虽然也将问题分为若干个子问题,但是各个子问题是独立的,定义 dp 数组中的元素时,我将当前元素定义为当前步骤所花费的最小体力,定义递推公式时,只是求当前的最小花费,因此各个状态之间是独立的,没有状态叠加。动态规划算法,如果某一问题有很多重叠的子问题,就可以使用动态规划算法,这一点和贪心算法相同,不同点之处在于,动态规划中的各个状态是此前状态的叠加,而贪心算法中的局部最优是独立的。4)确定遍历顺序,根据递推公式可知,当前整数对应的斐波那契数,由其前两个斐波那契数推到而来,因此遍历顺序为从前向后遍历;

2023-10-30 14:54:11 25

原创 代码随想录 10.28 || 贪心 LeetCode 738.单调递增的数字、968.监控二叉树

每个节点的监控情况如下(不包含父节点和其本身,因为一个节点总能监视到这两种节点):监控 2 个节点(左右子节点),监控 1 个节点(左 或 右节点),监控 0 个节点(叶子节点)。我们应该尽力避免在叶子节点放置摄像头,保证摄像头都放置在拥有叶子节点的节点上。当 n[i - 1] > n[i] 时,不符合单调递增数字的要求,此时我们要将 i - 1 位置的数字减 1,再将后面的数字置 9,比如 153, 5 比 3 大,此时我们将 153 变为 149,确保各个数位之间单调递增的同时,还要确保该数字为最大。

2023-10-29 15:37:21 58

原创 代码随想录 10.27 || 贪心 LeetCode 435.无重叠区间、763.划分字母区间、56.合并区间

其实不然,根据贪心算法的策略,全局问题为删除最少的区间,分解的局部子问题为删除重叠区间中,覆盖区间大的那个区间。在代码中,我们通过整数数组,存储字符串中每一种字符的最远位置,并随着遍历过程不断更新最原位置,一旦 i == right,说明当前子串内的所有字符都被包括了,此时返回子串的长度,并修正 left 的位置。为什么这么做,有的同学可能会问了,计数器自加,说明当前边界已经被删除了,为什么还要取两个边界中的最小值,而不是将当前边界的右边界值拷贝为上一个边界的右边界值?注意,此时,还需要将当前区间的。

2023-10-27 11:12:41 42

原创 代码随想录 10.26 || 贪心 LeetCode 860.柠檬水找零、406.根据身高重建队列、452.用最少数量的箭引爆气球

其中,20 美元的找零有两种方式,3 个 5 美元 或 1 个 10美元 和 1 个 5 美元,然而 5 美元 能同时找零 10 美元和 20 美元,5 美元更万能。然后遍历排序过后的气球数组,如果当前气球的右边界和前一个气球的左边界重合,就说明两个气球时重叠的,能够一箭射爆,此时更新最小的右边界,进一步判定下一个气球的左边界与最小右边界是否重叠。因为气球直径不一样,所以气球之间会有重叠,让能够重叠的气球,尽可能的重叠,当一箭射爆这些重叠的气球时,就能确保在全局解中,使用最少的箭。

2023-10-26 10:27:15 30

原创 代码随想录 10.25 || 贪心 LeetCode 1005.K 次取反后最大化的数组和、134.加油站、135.分发糖果

因此,我们需要对数组进行排序,这里按照数组绝对值进行降序排列,通过 for 循环判定元素值正负,如果元素为负,则取反,为正,则不操作。如果所有的负数都使用完毕,则对数组最小的元素(排序的最后一个元素)反复取反,这样可以保证最大化对数组和的正向效应和最小化对数组和的负向作用。即,当数组中存在负数时,将最小的负数取反;当数组中仅存在正数或零时,将最小的正数或零取反。全局问题求按照顺序环路行驶一周的出发油站,将问题分解,如果确保每一次加油和出发之后,油箱里仍有省油,则表明最终能环绕一周。

2023-10-25 22:18:41 29

原创 代码随想录 10.24 || 贪心 LeetCode 122.买卖股票的最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ

给你一个整数数组 prices,其中 prices[i] 表示某只股票第 i 天的价格。在每一天,你可以决定是否购买和、或售出股票。你在任何时候最多只能持有一股股票。你也可以先购买,然后在同一天出售。返回你能获得的最大利润。计算每一天的利润,如果是正向利润,我们就在收集该天的利润,如果是负利润,则跳过,确保每一天买入卖出获得的利润对最终利润都是正向作用,从而确保在最终获得最大利润。贪心算法,找到局部最优,确保全局最优。我们将利润分解为每天,确保每天收获的利润为正利润,则在最终天得到的利润即为最大利润。

2023-10-25 15:16:17 40

原创 代码随想录 10.23 || 贪心 LeetCode 455.分发饼干、376.摆动序列、53.最大子数组

起码要确保子数组的所有子数组的和大于0,比如 -2,1,3,-1,1,最大子数组一定不包括 -2,因为 -2 和 1 相加为 -1,即要求子数组中的每一个子数组都对该子数组的和做出正向贡献。目标为“尽可能满足最多数量的孩子”,这要求我们将最小的饼干分给胃口最小的孩子,物尽其用,确保充分利用每一块尺寸的饼干。偷懒不写文字解释了,具体详细可看代码随想录相关章节,大致思想就是确保摆动序列中的每一个元素具有摆动的性质,即当前元素 和前一个元素的差 与 和后一个元素的差 符号相反。但是,每个孩子最多只能给一块饼干。

2023-10-23 22:08:57 48

原创 代码随想录 10.21 || 回溯 LeetCode 51.N 皇后、332.重新安排行程、37.解数独

本题和 51.N 皇后 有异曲同工之处,都是棋盘问题,而不同之处在于,N 皇后 只在每一行找一个地方放置皇后,本题需要在每行的每个空置格子中放入数字,且数字需要满足一定条件。2. 确定回溯算法的终止条件,针对二维的棋盘,我们在行的方向上遍历棋盘,在每一行中,选取每一个元素,当遍历完所有行,即找到一个可能的解。3. 基本逻辑为,提取结果集里最后一个元素,这个元素代表了当前乘客所在的位置,依次遍历当前位置能够到达的位置,直到找到第一个解,因为 map 会排序,第一个解即为字节序最前的解,此时结束回溯即可。

2023-10-21 17:14:01 28

原创 代码随想录 10.20 || 回溯 LeetCode 491.递增子序列、46.全排列、47.全排列Ⅱ

不同之处在于,本题允许 nums 中存在重复数字,这需要我们在遍历的过程中去重,筛选掉重复的路径和重复使用的元素,注意这是两种不同的去重,重复的路径指的是在宽度维度上,已经使用过的元素,而重复使用的元素是指,在深度维度上,重复选定的元素。在本题中,我们需要取到所有的元素。代码的大体思路和使用到 used 标志数组去重的任务类似,唯一不同之处在于,在 for 中的判定条件中,我们需要对重复使用的元素做出判断,如果当前的元素,已经使用过,说明往下的树杈都是无用的,这时候我们直接 continue 即可。

2023-10-20 16:04:10 46

原创 代码随想录 10.19 || 回溯 LeetCode 93.复原 IP 地址、78.子集、90.子集Ⅱ

求数组子集问题,和组合问题稍后不同,组合问题是在数组中求满足条件的组合,有一些不必要的路径可以被剪枝掉,不比遍历整个树。而子集问题,没有条件限制,需要遍历树,找到所有可能的子集。与上题不同之处在于,给定的整数数组 nums 中带有重复数字,要求结果集中不能包含重复着的子集,需要在遍历的过程中去重。难点在于 isValid 函数的实现,分析子串是否合法,每段子串中的数字不能大于 255,不能以 0 开头。因为需要遍历整棵树,所以在递归中不设置终止条件,startIndex 逐渐增大,直至和数组的宽度一样。

2023-10-19 19:23:50 47

原创 代码随想录 10.18 || 回溯 LeetCode 39.组合总和、40.组合总和Ⅱ、131.分割回文串

回溯的基本逻辑,判断 startIndex 和 i 之间的子串是否为回文串,如果是,将其加入进 path,然后向深度递归,直至探索完字符串,如果当前子串不为回文串,则继续向下探索,直至循环结束,或者找到一个回文串。问题的宽度为数组长度,深度不限。这是一个利用回溯求集合内元素的组合问题,问题的宽度为整数数组的长度,并未指定问题的深度,只要当前和不满足 target,就一直递归深入,直至和大于或等于 target 为止。题中要求,可以重复选取元素,在最终的结果集中,如果有不同的数字,即为不同的组合。

2023-10-18 14:24:46 57 1

原创 代码随想录 10.17 + 10.16 || 回溯 LeetCode 77.组合、216.组合总和Ⅲ、17.电话号码的字母组合

终于进入回溯章节,回溯与递归相辅相成,在之前对于二叉树的学习,已经接触过回溯,我对于回溯的理解是,在向下递归结束后,返回至上一层递归的状态,叫作回溯。回溯能够解决的问题,都可以抽象为树形结构(N叉树)。

2023-10-17 16:34:40 27

原创 代码随想录 10.12 || 二叉树 LeetCode 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

递归的参数,二叉树的根节点和目标节点 q 和 q;递归逻辑,定义 n1de 和 n2de 用于保存左子树和右子树的信息,如果 n1de 和 n2de 同时不为 nullptr,说明符合条件的两个目标节点在同一层,这时最近的公共祖先即为当前节点,如果 n1de 或 n2de 任意一个节点为 nullptr,说明不为空的那个节点即为公共祖先节点;因为二叉搜索树是有序的,所以相同数字一定出现在一块儿,我们利用双指针记录当前节点和前一个节点的信息,统计数字的出现频率,将出现最多的数字加入进结果集,然后返回即可。

2023-10-13 17:06:02 78

原创 代码随想录 10.11 || 二叉树 LeetCode 654.最大二叉树、617.合并二叉树、700. 二叉搜索树中的搜索、98.验证二叉搜索树

3.明确基本递归逻辑,根据最大二叉树的定义,首先,在数组中找出最大的值,然后以最大值左边的数组构建左子树,以最大值右边的数组构建右子树。二叉搜索树,根节点的左子树都比根节点的值小,根节点的左子树都比根节点的值大。判断给定的二叉树是否为二叉搜索树,本题的返回值为 bool 类型,当找到一个不满足条件的节点时,就返回false,如果遍历二叉树未找到这个节点,则返回 true。null 的节点将直接作为新二叉树的节点。1. 明确参数和返回值类型,参数为两棵二叉树的根节点,返回值类型为构建的二叉树的根节点;

2023-10-11 21:33:42 36

原创 代码随想录 10.10 || 二叉树 LeetCode 513.找树左下角的值、112.路径总和、113.路径综合Ⅱ、106. 从中序与后序遍历序列构造二叉树

代码中为前序遍历,保证在每一层中,第一个遍历该层最左边的节点,如果该节点满足条件,修改 maxDepth 为 depth,同时 result 记录该节点的值,即使同一层存在其他节点,因为 depth 不大于 maxDepth,也不会修改 result 中的内容。否则,返回 false。第二种方法,迭代法,注意,和之前定义栈的类型不同,这里定义pair类型的栈,在 pair 中,第二个位置存放从根节点到当前节点的路径和,以 pair 中第二个元素和目标和是否相同作为判定依据。

2023-10-10 20:04:01 39 1

原创 代码随想录 10.09 || 二叉树 LeetCode 110.平衡二叉树、257.二叉树的所有路径、404. 左叶子之和

在精简版的代码中,使用的形参类型和详细版不同,path 没有使用引用传递,而是值传递,意味着在每次递归中,都会创立一个 path 的副本,不同递归次数之间的 path 互不影响,在同一个递归中,path 是相同的。treeSt 负责遍历二叉树,pathSt 负责记录路径,如果当前节点为叶子节点,将 pathSt 中的栈顶元素,对应的是从根节点至当前叶子节点的路径,添加进结果集中。回溯至其最左叶子节点的父节点;中,我们通过求根节点的高度,进而得到二叉树的最大深度,因为根节点的高度就是这颗二叉树的最大深度。

2023-10-09 16:18:23 46 1

原创 代码随想录 10.07 || 二叉树 LeetCode 104.二叉树的最大深度、559.N叉树的深度、111.二叉树的最小深度、222完全二叉树的节点个数

3. 确定基本逻辑,这里我们使用后序遍历,左右根的顺序,先充分探索当前节点的左子树,然后探索右子树,将左右子树的深度返回给当前节点,一层一层的将信息返回至根节点。上面代码为完全二叉树的解法,完全二叉树,有两种情况,一种是满二叉树,另一种不满二叉树,当满二叉树的时候,可以直接用公式计算出节点个数;如何判断是不是为满二叉树呢?二叉树相关的题解,一般都有深度优先遍历和广度优先遍历两种解法,在深度优先遍历中,可能存在前序、中序和后序解,前中后序又存在递归解和迭代解,解法丰富,思路很广,看似简单的题目实则“复杂”。

2023-10-07 22:33:08 34 1

原创 代码随想录 10.06 || 二叉树的广度优先遍历(层序遍历)、翻转二叉树、对称二叉树

层序遍历也可以递归实现,但是迭代实现的层序遍历可以解决很多问题,可以作为二叉树层序遍历的通解,比如力扣的102、107、199、637、429、515、116、117、104和111。可以通过深度优先搜索的迭代法和递归法实现,在此仅给出相对简单的递归法,笔者尝试过层序遍历的方法,但是无法判断对应位置上的节点是否相同,只能判断左右子树的值相同,大家可以试试层序遍历的实现方法。广度优先遍历,又称层序遍历,逐层遍历二叉树,在每一层中,从左至右依次遍历各个结点。交换二叉树左右子树对应位置的节点,即完成翻转。

2023-10-06 22:56:51 45 1

原创 代码随想录 10.05 || 二叉树 LeetCode 144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历

二叉树理论基础,手写二叉树的数据结构,掌握前中后序二叉树的递归遍历和迭代遍历,了解二叉树前中后序的统一迭代遍历法。

2023-10-06 15:13:36 33 1

空空如也

空空如也

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

TA关注的人

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