算法训练
文章平均质量分 57
leetcode打卡
千Q
这个作者很懒,什么都没留下…
展开
-
代码随想录算法训练营 总结篇
虽然已经大三了,但是没有系统的刷过算法。其实训练营的价格对我来说是稍贵的,但是我这个拖拉又摆烂的性子,如果没有人监督,那肯定是三天打鱼两天晒网,坚持不下来的,更何况还有作业、课设一些东西会让我没有时间去刷算法,于是决定还是报名参加,毕竟都已经大三了呀。除此之外,有不懂的问题是最方便寻求解决方案的,群里的朋友们都很热心,会耐心的为你解决问题。我就是在看别人博客的时候发现了一个同学,他每天都会完成当天的训练,有时候我来不及写题的时候,就会去看看他的博客,看他每天写题,我也有了点动力,想着不要落后啊!原创 2024-05-10 23:00:12 · 357 阅读 · 0 评论 -
代码随想录算法训练营第六十三天|84.柱状图中最大的矩形
个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。:找到当前元素的左右两边比它小的值。求在该柱状图中,能够勾勒出来的矩形的最大面积。84.柱状图中最大的矩形。原创 2024-05-10 22:59:32 · 166 阅读 · 0 评论 -
代码随想录算法训练营第六十三天|84.柱状图中最大的矩形
个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1。:找到当前元素的左右两边比它小的值。求在该柱状图中,能够勾勒出来的矩形的最大面积。84.柱状图中最大的矩形。原创 2024-05-10 22:39:34 · 218 阅读 · 0 评论 -
代码随想录算法训练营第六十二天|503.下一个更大元素II、42.接雨水
单调栈解法,因为是递增的栈,所以当遇到比栈顶元素大时,此时栈顶元素就找到了左边第一个大的值和右边最大的一个值,求两者的差即可。是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。:两个数组模拟转圈的过程,可以重新定义一个数组,这个数组将原数组拼接两次,就模拟了转圈的过程。的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。个非负整数表示每个宽度为。503.下一个更大元素II。原创 2024-05-10 22:20:39 · 175 阅读 · 0 评论 -
代码随想录算法训练营第六十一天|739.每日温度、496.下一个更大元素I
单调栈解法的实现:用一个栈来保存我们遍历过的值,如果需要的是第一个大于的值,那么栈的顺序是递增的,反之则是递减的。使用单调栈需要判断大于、小于、等于的情况。大于和小于的情况根据题意,递增大于需要while循环,递减小于也是。天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用。:嗯,这个题目的意思表达真的是让人看不懂啊。如果不存在下一个更大元素,那么本次查询的答案是。,表示每天的温度,返回一个数组。需要一个map映射关系。时间复杂度为O(n)。496.下一个更大元素。原创 2024-05-10 10:49:08 · 282 阅读 · 0 评论 -
代码随想录算法训练营第六十天|647.回文字串、516.最长回文子序列
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。,找出其中最长的回文子序列,并返回该序列的长度。:和上一题相比,这题多了一个条件是字符可以不连续。是字符串中的由连续字符组成的一个序列。是正着读和倒过来读一样的字符串。,请你统计并返回这个字符串中。516.最长回文子序列。原创 2024-05-05 15:02:11 · 190 阅读 · 0 评论 -
代码随想录算法训练营第五十六天|583.两个字符串的删除操作、72.编辑距离
可以发现插入和删除就是上一个的情况,这个题与上一个题相比是多了一个替换的情况,替换的话就从前一个相等的情况延续下来,替换步数加一。 两个元素相等,删除其中一个或者两个都删,不过两个都删除的情况是包含在删除其中一个的情况中的 dp[i]j=min(dp[i-1]j+1,dp[i]j-1+1)dp[i]j :以i-1为结尾和以 j-1 为结尾的两个字符串相同需要删除的最小步数。递推公式:两个元素相等,不删 dp[i]j=dp[i-1]j-1。可以删除任意一个字符串中的一个字符。原创 2024-05-03 09:27:09 · 227 阅读 · 0 评论 -
代码随想录算法训练营第五十五天|392.判断子序列、115.不同的子序列
思想都是一样的,不同的是因为考虑的是有多少个,所以当两个字符串的元素相等时,s中的元素可以使用也可以不使用,两种情况的总和。另一个不同的点在于初始化,如果t是空串的话,字符串中有1个空串,反之则有0个。字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。:和最长相同子序列的思路是一样的,如果相同子序列的长度等于短的那个字符串的话,它就是另一个字符串的子序列。dp[i]j :以 i-1 和 j-1 为结尾的字符串的最长相同子序列的长度。115.不同的子序列。原创 2024-05-02 23:25:32 · 418 阅读 · 0 评论 -
代码随想录算法训练营第五十三天|1143.最长公共子序列、1035.不相交的线、53.最大子序和
如果当前它们不相等,那要考虑1的前一位和2的当前位,以及2的前一位和1的当前位是否相等。递推公式 :如果两个元素相等,那就是最长重复子数组的情况 dp(i,j)=max(dp(i-1,j-1)+1,dp(i,j))是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。:这个题贪心写过,贪心的思想是只要相加的和是正数,那么就加上这个值,不是的话就sum=0,重新开始即可。:这个题和上一个题是一样的,只是描述不一样。原创 2024-04-28 15:41:16 · 332 阅读 · 0 评论 -
代码随想录算法训练营第五十二天|300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组
是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。:两层for循环,一层找到i,下一层遍历从0 到i 的小于nums[i] 的值。这个条件,既然是连续的话,只需要考虑当前元素和前一个元素的关系即可。给定一个未经排序的整数数组,找到最长且。:求两个数组的最长公共子序列的最大长度。,找到其中最长严格递增子序列的长度。、长度最长的子数组的长度。674.最长连续递增序列。300.最长递增子序列。,并返回该序列的长度。)确定,如果对于每个。就是连续递增子序列。:在上一题的基础上加了。原创 2024-04-28 13:57:18 · 261 阅读 · 0 评论 -
代码随想录算法训练营第五十一天|309.最佳买卖股票的时机含冷冻期、714.买卖股票的最佳时机函手续费
在买卖股票II的基础上增加了一个冷冻期,冷冻期是在卖出股票的后一天,所以要将不持有股票的状态分开来,分成保持卖出状态和卖出状态,这样才能找到冷冻期,也就是本题有4个状态。这个题目描述有点模糊啊,每一笔交易都要支付手续费的话不应该是买入要手续费,卖出也要手续费吗,这个通过代码买入和卖出只需要一笔手续费。**注意:**这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。dp解题步骤和买卖股票的最佳时机II是一样的,在那个代码的基础上减去手续费即可。代表了交易股票的手续费用。原创 2024-04-28 10:24:10 · 254 阅读 · 0 评论 -
代码随想录算法训练营第五十天|123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV
dp[0] 3]=-price[0] //第一天买入,然后卖出,然后再买入。因为可以有k次买卖,也就是k次买入,k次卖出,那么二维数组的大小就需要是 2*k+1。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。**注意:**你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。观察后能发现,奇数是买入,偶数是卖出,OK,现在开始写代码吧。设计一个算法来计算你所能获取的最大利润。设计一个算法来计算你所能获取的最大利润。初始化:dp[0] 0]=0。原创 2024-04-27 21:42:30 · 288 阅读 · 0 评论 -
代码随想录算法训练营第四十九天|121.买卖股票的最佳时机、122.买卖股票的最佳时机II
不持有: dp[i] 0] =max(dp[i -1[0],dp[i-1] 1]+ price[i]):和上一题的区别在于,这个股票可以每天都买进或是卖出,上一题只能买一次卖一次,这个题可以买卖多次。:每天的两支股票都有两种状态,持有和不持有,所以用一个二维数组表示每天每支股票的状态。递推公式:持有:dp[i] 1] =max(dp[i-1][1 ,-price [i)dp[i] 1]: **持有 **第 i 天的这支股票的最大金额。dp[i] 1 :今天持有。原创 2024-04-27 20:42:28 · 191 阅读 · 0 评论 -
代码随想录算法训练营第四十八天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III
将环的问题转换成线性问题,分别考虑只取首或尾的情况,然后取两者的最大值即可。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,每个节点都有两种状态,偷和不偷,用dp[0]表示不偷,dp[1]表示偷,那么dp数组的大小就为2.同时,相邻的房屋装有相互连通的防盗系统,是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。337.打家劫舍III。原创 2024-04-27 18:23:12 · 1467 阅读 · 0 评论 -
代码随想录算法训练营第四十六天|139.单词拆分、背包问题总结
递推公式 :dp[j] 是true,且 [j, i] 这个区间的子串出现在字典里,那么dp[i]一定是true。所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。dp[i] : 长度为 i 的字符串是否能被字典中的单词组成的结果是 dp[i]**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。:单词的组成是有顺序的,所以是一个完全背包的排列问题。遍历顺序:排列问题,先背包后物品。原创 2024-04-20 20:50:02 · 384 阅读 · 0 评论 -
代码随想录算法训练营第四十五天|70.爬楼梯、322.零钱兑换、279.完全平方数
70.爬楼梯。原创 2024-04-20 20:10:29 · 306 阅读 · 0 评论 -
代码随想录算法训练营第四十四天|完全背包、518.零钱兑换II、377.组合总和IV
物品可以被取无限次。卡码网52.携带研究材料。原创 2024-04-19 20:58:43 · 430 阅读 · 0 评论 -
代码随想录0.算法训练营第四十三天|1049.最后一块石头的重量II、494.目标和、474.一和零
也是一个分集合问题,将元素分为加法和减法两个集合。有多少个加法集合或者是多少个减法集合就有多少种方法。:把石头总和分成近似相等的两堆,然后让他们相撞。每个石头只能取一次,就是一个一维的01背包问题。背包的容量有两个维度,也就是在往背包中装物品的时候需要考虑两个方面。i++){ //物品。j–){ //背包。,然后将它们一起粉碎。假设石头的重量分别为。,然后串联起所有整数,可以构造一个。的最大子集的长度,该子集中。有一堆石头,用整数数组。原创 2024-04-18 10:20:29 · 338 阅读 · 0 评论 -
代码随想录算法训练营第四十二天|01背包问题(二维、一维)、416.分割等和子集
01背包问题:回溯遍历每种物品取和不取的价值,时间复杂度是2^n。 不放物品 i : dp[i-1][j //取0 - i-1个物品的价值 放入物品 i :dp[i-1] j-wight i +value[i] //放入物品 I 后需要加上i 的价值并且背包容量要减去i的重量卡码网46.携带研究材料。原创 2024-04-16 22:38:15 · 372 阅读 · 0 评论 -
代码随想录算法训练营第四十一天|343.整数拆分、96.不同的二叉搜索树
将数字尽可能拆分成m个近似相等的子数,这样乘积才最大。递推公式:二叉树的个数=左子树的个数*右子树的个数。dp[i]:输入 i 有 dp[i]种不同的二叉树。返回满足题意的二叉搜索树的种数。初始化:dp[0]=0 dp[1]=1。),并使这些整数的乘积最大化。个节点组成且节点值从。96.不同的二叉搜索树。你可以获得的最大乘积。原创 2024-04-16 19:50:51 · 150 阅读 · 0 评论 -
代码随想录算法训练营第三十九天|62.不同路径、63.不同路径II
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?:和不同路径方法是一样的,不同的地方在于这个题需要考虑障碍问题。网格的左上角 (起始点在下图中标记为 “Start” )。网格的左上角 (起始点在下图中标记为 “Start” )。网格中的障碍物和空位置分别用。问总共有多少条不同的路径?原创 2024-04-14 19:31:34 · 266 阅读 · 0 评论 -
代码随想录算法训练营第三十八天|509斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。开始,后面的每一项数字都是前面两项数字的和。你有多少种不同的方法可以爬到楼顶呢?请你计算并返回达到楼梯顶部的最低花费。746.使用最小花费爬楼梯。表示)形成的序列称为。原创 2024-04-14 18:36:01 · 170 阅读 · 0 评论 -
代码随想录算法训练营第三十七天|738.单调递增的数字、968.监控二叉树
将数字转换为String类型,然后从后往前遍历,让遇到前一位比后一位大的时候,前一位减一,后面几位全部变成9。:从下往上遍历二叉树,然后在二叉树的父节点放置摄像头,之后每隔两个空节点再放置一个摄像头。给定一个二叉树,我们在树的节点上安装摄像头。计算监控树的所有节点所需的最小摄像头数量。当且仅当每个相邻位数上的数字。节点上的每个摄影头都可以监视。的最大数字,且数字呈。738.单调递增的数字。时,我们称这个整数是。原创 2024-04-11 12:46:37 · 248 阅读 · 0 评论 -
代码随想录算法训练营第三十六天|435.无重叠区间、763.划分字母区间、56.合并区间
先将前一个数组加入到结果集中,合并就直接更新右边界即可。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是。一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。在遍历字符串的时候,记录每个字符出现的最远的位置。:求重叠区间,重叠区间数就是要移除的区间数。需要移除区间的最小数量,使剩余区间互不重叠。返回一个表示每个字符串片段的长度的列表。表示若干个区间的集合,其中单个区间为。请你合并所有重叠的区间,并返回。原创 2024-04-10 20:08:48 · 298 阅读 · 0 评论 -
代码随想录算法训练营第三十五天|860.柠檬水找零、406.根据身高重建队列、452.用最少数量的箭引爆气球
现根据身高从大到小进行排序,然后看它前面有多少个人,再插入到对应的位置即可。有一些球形气球贴在一堵用 XY 平面表示的墙面上。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付。处射出一支箭,若有一个气球的直径的开始和结束坐标为。表示队列中一些人的属性(不一定按顺序)。假设有打乱顺序的一群人站成一个队列,数组。你不知道气球的确切 y 坐标。顾客排队购买你的产品,(按账单。在柠檬水摊上,每一杯柠檬水的售价为。注意,一开始你手头没有任何零钱。:记录每张面额的数量,用于找零。支付的顺序)一次购买一杯。原创 2024-04-09 19:53:22 · 224 阅读 · 0 评论 -
代码随想录算法训练营第三十四天|1005.K次取反后最大化的数组和、134.加油站、135.分发糖果
计算到达每一个加油站的补充和消耗的差值,从头开始累加这个差值,如果小于0,说明油不够到达下一个站点,那么将遍历的下一个节点作为开始值。一次考虑右边孩子比左边孩子大的情况,一次考虑左边比右边大的情况,然后取两次的最大值就是孩子应该拥有的糖果数。,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回。你从其中的一个加油站出发,开始时油箱为空。请你给每个孩子分发糖果,计算并返回需要准备的。以这种方式修改数组后,返回数组。,还是老老实实重新拍一次序吧。:单独写一个排序算法。表示每个孩子的评分。原创 2024-04-08 16:12:41 · 141 阅读 · 0 评论 -
代码随想录算法训练营第三十二天|122.买卖股票的最佳时机、55.跳跃游戏、45.跳跃游戏II
这个题的意思是:从数组下标为0的地方开始跳跃,跳跃的步数是小于等于数组的值。那么有一个问题是如果当前值是3,那么我该怎么一次跳2次,一次跳1次呢?:这个题与上一个题的区别在于:上一个题只需要知道能不能到终点,而这个题要求找到最小的跳跃数,也就是在上一个题的基础上加一些条件去记录最小跳跃数。:只有能获得正收益时才卖出,这样所获得的最大值就是所有正收益的值。在每一天,你可以决定是否购买和/或出售股票。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标,如果可以,返回。原创 2024-04-07 19:57:15 · 252 阅读 · 0 评论 -
代码随想录算法训练营第三十一天|455.分发饼干、376.摆动序列、53.最大子序和
如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 **摆动序列。假设你是一位很棒的家长,想要给你的孩子们一些小饼干。可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。:当当前连续和是负数的时候,就舍弃连续和,以下一个数作为起点。,这是能让孩子们满足胃口的饼干的最小尺寸;:for循环+if判断,尽量用大饼干满足胃口大的孩子。原创 2024-04-06 16:42:20 · 504 阅读 · 0 评论 -
代码随想录算法训练营第三十天|回溯算法的总结、332.重新安排日程
回溯算法可以解决的问题组合问题:如果是一个集合求组合,需要用startIndex,如果是多个集合,且集合之间互不影响,则不用startIndex。 去重问题:先给数组排序,然后用标记数组记录哪些数字已经被使用过。排列问题:每层都是从0开始搜索,用标记数组记录哪些数据已经被使用过。切割问题:切割问题难度在于怎么切割呢?终止条件是什么?如果获取切割完后的字串呢?原创 2024-04-06 15:05:05 · 266 阅读 · 0 评论 -
代码随想录算法训练营第二十九天|491.非递减子序列、46.全排列、47全排列II
组合的去重是用used数组在树层上去重,那么排列应该怎么去重呢?排列也是在树层上去重,那么具体怎么实现呢?因为元素的内容相等,所以不在树层上重复遍历,标记数组的方式是见代码,两个相同的数通过标记数组进行标记。并且排列的结果都在叶子节点,搜索的深度也就是数组的长度,排列是包括所有元素的。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。也就是说,去重也是先给数组排序,然后用当前元素和前一个元素比较。,找出并返回所有该数组中不同的递增子序列,递增子序列中。返回所有不重复的全排列。原创 2024-04-05 18:31:24 · 268 阅读 · 0 评论 -
代码随想录算法训练营第二十八天|93.复原IP地址、78.子集、90.子集II
和组合问题的逻辑是差不多的,区别在于:组合是在叶子节点收获结果,也就是叶子节点是结果,终止条件可以直接判断有没有到叶子结点,并且在终止条件中收获结果集。:组合和集合结合的问题。需要考虑组合中元素在同一个子集中可以重复出现,但是不能出现重复的子集,所以需要用used数字记录每个数字是否已经被横向遍历过(需要给原数组排序),然后看数组当前值和前一个值是否相等,并判断前一个值是否被遍历过。子集则是收集结果的时候注意树层的也是结果,终止条件和收集结果的地方需要注意。,用以表示一个 IP 地址,返回所有可能的。原创 2024-04-05 15:51:09 · 284 阅读 · 0 评论 -
代码随想录算法训练营第二十七天|39.组合总和、40.组合总和II、131.分割回文
它是横向不能有重复的,可是竖向可以有重复的,并且每个元素只能用一次,所以用一个boolean类型的used数组,将遍历过的元素的下标置为true。并且将数组排序,如果当前元素和前一个元素相等,并且前一个元素已经遍历过了的话(used数组下标为true),就跳过这个值往下遍历。需要注意的是,数组中的元素可以重复使用,那么for循环中的回溯参数需要是i,表示当前元素可以选取。切割问题,就是选取元素的过程,只是将选取的元素组成一个字串,并且是回文字串的情况下才加入到path集合中。对于给定的输入,保证和为。原创 2024-04-04 20:53:05 · 416 阅读 · 0 评论 -
代码随想录算法训练营第二十五天|216.组合总和III、17.电话号码的字母组合
数字对应的字母用数组来做映射。对于将输入的表示数字的字符串,转换为数字的方式是减去字符0。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。该列表不能包含相同的组合两次,组合可以以任何顺序返回。:回溯控制:总数控制宽度,一个结果集中有多少个数控制深度。的字符串,返回所有它能表示的字母组合。所有可能的有效组合的列表。17.电话号码的字母组合。216.组合总和III。原创 2024-03-31 16:15:19 · 248 阅读 · 0 评论 -
代码随想录算法训练营第二十四天|回溯理论基础、77.组合
回溯算法的解决问题都可以抽象成树形结构,因为回溯算法解决的问题都是在接种递归查找子集,集合的大小构成了数的宽度,递归的深度,构成了树的深度。 搜索到叶子节点,也就找到了满足条件的一条大难,将这个答案保存起来,结束本层递归。 回溯的本质是穷举,穷举所有可能,找到我们的答案,也就是暴力搜索。 返回值一般是void,先写逻辑,需要什么参数再写。在集合中递归搜索,用for横向遍历,然后递归纵向遍历。 递归就要有终止条件,所以是一棵高度有限的树。回溯叶子节点就是结果。原创 2024-03-31 13:32:12 · 275 阅读 · 0 评论 -
代码随想录算法训练营第二十三天|669.修建二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树
需要注意的是,这个删除是删除多个符合条件的节点,因为二叉搜索树的性质,如果节点小于区间,那么节点的所有左子树都小于区间,这时,考虑节点的右区间,再递归看右区间有没有符合条件的节点,有的话,返回到根节点,成为根节点的左孩子。如果节点大于区间,那么节点的所有右孩子都大于区间,都是要删除的节点,这时,考虑节点的左孩子有没有符合条件的值。构造根节点,然后构造该节点的左节点和右节点。树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点。给你二叉搜索树的根节点。原创 2024-03-30 23:31:12 · 302 阅读 · 0 评论 -
代码随想录算法训练营第二十二天|235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点
无论插入的是任何大小的数,都能在叶子节点找到它的位置。后序遍历方式,递归出口是遍历到了空节点,说明空节点的上一个节点是叶子节点,那么就将这个值返回给叶子节点对应的左节点或右节点。:后序遍历,因为最后是要返回节点,所以需要将节点从下往上返回,也就是说中间节点是处理逻辑。中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。原创 2024-03-28 20:30:51 · 247 阅读 · 0 评论 -
代码随想录算法训练营第二十一天|530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先
中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(当中序遍历二叉树时,数组就是有序的。本题可以采用中序遍历加入数组中,然后遍历数组,记录最小的两个数据之和。也可以不用数组的方法。给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。给你一个含重复值的二叉搜索树(BST)的根节点。差值是一个正数,其数值等于两值之差的绝对值。,找出并返回 BST 中的所有。给你一个二叉搜索树的根节点。(即,出现频率最高的元素)。原创 2024-03-27 20:46:11 · 553 阅读 · 0 评论 -
代码随想录算法训练营第二十天|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;:返回以目标节点为根节点的子树,返回这个节点即可。二叉搜索树的特点是左节点值<中节点的值<右节点值。本题是保证根节点是最大值,然后以根节点为中点,左边是左子树,右边是右子树。需要注意的是单层递归逻辑里面的划分左右节点的区间问题 ,统一采用前闭后开的方式。处理中间节点的逻辑,中间节点既要大于左边所有节点,又要小于右边左右节点。:直接的想法就是中序遍历,使用数组保存遍历过的节点值,然后看数组是不是递增的。返回以该节点为根的子树。原创 2024-03-26 21:51:01 · 284 阅读 · 0 评论 -
代码随想录算法训练营第十八天|513.找树左下角的值、112.路径总和、113.路径总和II、106.从中序与后序遍历构造二叉树、105.从前序与中序遍历构造二叉树
和上一个题相比,有一个问题:pre的开始节点要怎么确定呢,第一个当然是0,第二个是加上len后的位置,但是len 又得在开始节点后面才能确定,所以要怎么解决这个问题呢?从跟节点开始,每到要遍历到下一个节点,要减去当前节点的值,减到最后一个节点,如果目标值减去的值和叶子节点的值相等,说明这是一条可行的道路。递归解法:如果节点是叶子节点,判断当前深度是不是最大深度,是的话就保存该节点的值,然后更新深度,不是则不更新值和深度。迭代解法:层序遍历,最后一个节点的值就是需要的值。是指没有子节点的节点。原创 2024-03-24 16:31:54 · 419 阅读 · 0 评论 -
代码随想录算法训练营第十七天|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和
这个题可以轻松的判断只不是叶子节点,难点在于怎么判断它是不是左节点呢。所以不判断到叶子结点,而是判断到叶子结点的父节点,然后再判断该节点的左节点的左右孩子是不是都为空。将当前节点的val加入list后,判断左右孩子的状态,然后再递归,找另外一条路径需要返回上一个节点,val的list列表需要remove。采用后序遍历的递归方式来解决问题,因为当前节点的深度需要下一层节点深度返回加一,所以递归选择左右中的遍历方式。,返回所有从根节点到叶子节点的路径。是指没有子节点的节点。,返回所有左叶子之和。原创 2024-03-23 19:48:12 · 303 阅读 · 0 评论