自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 代码随想录冲冲冲 Day60 图论Part11

floyd算法 其实就是先用i和j拼成一个平面 然后看每次从i到j距离。所有根本逻辑是i j确定一个面 再通过不同的k去看每一个中间点。所以k要在最外层 上一次的值要作用在下一次当中。Astar算法 根本来说就是一个bfs的加强版。通过定义一个计算的距离 从而一步一步的去迭代。priority_queue就是用来排序的。那么最小步数就要取这两个的最小值。对于每一个点来说 要根据。1.中间没有经过别的点。2.中间有经过别的点。

2024-09-30 17:31:48 397

原创 代码随想录冲冲冲 Day59 图论Part10

这是基于之前Bellman_ford算法的一个优化,之前讲到可以通过n-1次来完全松弛得到答案。下一轮松弛的时候,就把队列里 que_size 个节点都弹出来,就是上一轮松弛入队列的节点。对于SPFA也是一样 用一个变量 que_size 记录每一轮松弛入队列的所有节点数量。如果是负权和了 那么Bellman_ford在n-1次松弛之后 数值依旧会变化。2.在que的基础上记录每个点的松弛次数 如果出现松弛次数=n 说明一定有环。1.直接松弛n次,在第n次观察是否还会变化 如果还会变化就是有环。

2024-09-30 02:16:15 276

原创 代码随想录冲冲冲 Day58 图论Part9

状态一: minDist[A] + value 可以推出 minDist[B] 状态二: minDist[B]本身就有权值 (可能是其他边链接的节点B 例如节点C,以至于 minDist[B]记录了其他边到minDist[B]的权值)之后由于使用了priority_queue来构造最小堆,在加上传入queue中的都是一个点以及点到原点的距离,根据自定义的判断公式,已经默认排好了最小也就是离得最近的。minDist[B] 表示 到达B节点 最小权值,minDist[B] 有哪些状态可以推出来?

2024-09-27 22:08:56 615

原创 代码随想录冲冲冲 Day56 图论Part8

如果说有项链,并且之前cur到原点的值 + cur到邻边的值小于现在记录的minDist[v]如果说result集中的个数 不等于总个数,这就说明有的点入度一直都不可能为0;每次取出这个点,因为这个点的入度一定为0 所以可以直接放入result集中。接着更新这个确认的点指向的其他点,把这个点去掉的方法就是把所有相连的点的。这道题和prime方法非常相似,区别是prime算的是节点到树的最小距离。首先要记录每一个点的入度,当一个点的入度为0时,就说明这个点是顶点。第一步找到没有访问过的点中离七十点最近的。

2024-09-27 00:44:58 503

原创 代码随想录冲冲冲 Day55 图论Part7

这么写,最后更新的逻辑是 parent[1] = 2, parent[1] = 3, parent[1] = 4, 最后只能记录 节点1 与节点 4 相连,其他相连情况都被覆盖了。简单点理解的话就是在这一步会筛选出离这个刚刚加入的节点最近的节点 用parent来把最近节点指向刚刚加入的节点,这个过程中会把所有和刚刚加入树的节点都先连上,后面如果有更近的会更新。既然 minDist数组 记录了 最小生成树的边,是不是就是在更新 minDist数组 的时候,去更新parent数组来记录一下对应的边。

2024-09-25 22:05:59 840

原创 代码随想录冲冲冲 Day54 图论Part6

最后如果没有入度为2的情况 说明当前一定成环了 之间删掉导致成环的边就可以了。先判断这两个点是否是同一个根 如果不是 继续加入 如果是直接返回。根本的思想其实就是在加入一条边之前 如果两个点已经是同一个根了。这道题除了并查集本身的部分主要是多了两个函数和要计入入度情况。当一个点的入度为2时就说明这个点可能要进行删除边的操作了。那么加入这条边一定会是形成循环的 所以对于每一条边来说。如果不算上这条边 还成环了 直接删除另一条边就可以了。如果不算上这条边 其他的没有成环那么就直接删除。

2024-09-25 00:54:30 315

原创 代码随想录冲冲冲 Day53 图论Part5

因为 find 函数向上寻找根节点,father[u] 表述 u 的父节点,那么让 father[u] 直接获取 find函数 返回的根节点,这样就让节点 u 的父节点 变成根节点。我们只需要在递归的过程中,让 father[u] 接住 递归函数 find(father[u]) 的返回结果。给出B元素,就可以通过 father[B] = C,找到根也为为 C,说明 A 和 B 是在同一个集合里。可以通过给出A元素,就可以通过 father[A] = B,father[B] = C,找到根为 C。

2024-09-23 20:46:07 480

原创 代码随想录冲冲冲 Day52 图论Part4

forloop有两个 一个是forloop字符的每一个位置 另一个就是forloop这个位置。while loop每次看新的单词的时候 要把这个单词当前的路线数量也拿出来。如果经过更改后这个新单词在单词list中 并且并没有被生成过 那么把这个单词。所有的字母 如果通过变化出现了最后要得到的字符串 就是直接返回path+1。这道题是找每次更改一个字母 从初始字符串到最后一个字符串要多少次。还需要一个map去存每一波到新的list中的元素时候的步数。每次到了新的就标记为已访问过 然后使用key继续向后传递。

2024-09-22 23:43:58 254

原创 代码随想录冲冲冲 Day51 图论Part3

遍历每一个海面 把周围的陆地面积和当前这个点相加得到最终面积 每一个陆地都会初始化count。跟刚刚那道题刚刚好相反 把所以边缘陆地进行标记 最后遍历所有点 把不是标记的全部标为海洋。在具体求结果的时候 会遍历每个边 这样与边相连的陆地都会被标记 然后改成海洋。对于这道题的dfs 会把所有的链接边缘的陆地变成海洋 这样在全部调整之后。剩下的就是孤岛了 这道题中的dfs的结束条件就是遇到海洋时。首先dfs的作用就是在遇到陆地的时候找到所有的周围陆地。用dfs看找这个点所有的临近点知道访问到终点为止。

2024-09-20 19:27:18 496

原创 代码随想录冲冲冲 Day50 图论Part2

用这个count来记录当前这个新陆地的面积,在每一次dfs后跟新result。但是bfs时使用queue的 首先先把第一个点放入其中 每一次放入后都标记为已访问。整体也是一样的,由于bfs中其实不存在回溯 所以在第一个点加入是就要count++整体思路跟上面的一样 区别是要记录陆地面积 那么每一次if中都要初始化count。在dfs的过程中,返回条件是当前这个点已经被访问过或者这个点代表海洋。整个这个dfs在做的事情就是 当发现一个陆地后 寻找所有连续的陆地。其次在任何一个点进入dfs后,先标记为访问过。

2024-09-19 23:33:24 409

原创 代码随想录冲冲冲 Day49 图论Part1

一般情况,深搜需要 二维数组数组结构保存所有路径,需要一维数组保存单一路径,这种保存结果的数组,我们可以定义一个全局变量,避免让我们的函数参数过多。通常我们递归的时候,我们递归搜索需要了解哪些参数,其实也可以在写递归函数的时候,发现需要什么参数,再去补充就可以。再之后再看i到终点的路径 也就是下一个dfs 完成并返回后 要进行回溯 保证能够访问上层节点的一下一个节点。一般这里就是一个for循环的操作,去遍历 目前搜索节点 所能到的所有节点。用一道题去简单实现了一下dfs的流程代码,看是如何记录路径的。

2024-09-18 17:10:50 603

原创 代码随想录冲冲冲 Day48 单调栈Part2

如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),right(6),但是得不到 left。如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 6 进行比较,周而复始,那么计算的最后结果result就是0。首先是怎么去理解接雨水 其实就是找每一个段的左边第一个最大值和右边第一个最大值。

2024-09-18 00:58:39 269

原创 代码随想录冲冲冲 Day47 单调栈Part1

初步了解单调栈,根本思想就是如果求的是一个元素右边或左边第一个最大的元素 那么就是递增栈,如果是最小的就是递减栈。当后面的值小于等于这个top时 就要先把index放入st中,说明之前放入的还没找到。这道和上一道基本一样,不一样的是题目中要求放另一个nums的元素到第一个的位置上。result的st.top()也就是之间放入的值的位置就等于差值(题目需要的)更小了就得先给这个更小的找了 所以st中把更小的这个的index值放入。第一个最大的,刚刚放入的这些也是要找的。比较完后把比较过的pop走。

2024-09-17 03:34:33 335

原创 代码随想录冲冲冲 Day45 动态规划Part13

2.如果i和j差距2个以上,这时如果dp[i+1][j-1]也就是中间部分是true的那么加上两端也已经是true的。迭代方式 当 i j 值相同时 dp[i][j] 就是 i+1到j-1这个中间范围的个数加上两个断点。初始化 当 i == j 也就是dp[0][0] dp[1][1]...这样的情况 回文子序列为1。1.如果i和j一样或者i-1和j一样 那么dp[i][j]为true,因为一共就一个元素或者两个。dp[i][j]为下表为i ~ j是否是回文子串。返回dp[0][终点]的个数。

2024-09-14 17:20:22 335

原创 代码随想录冲冲冲 Day44 动态规划Part12

dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]那么dp[i][j]有两个方面组成 如果说使用了s[i-1] 就看i-2和j-2的部分。替换的话相当于更改其中一个 但是改哪个都行 所以是dp[i-1][j-1] +1;dp[0][j] 当i是0的时候 无论j是多少都为0 因为没有办法得到。1.s[i - 1] 与 t[j - 1]相等。不用s[i-1] 就要用 i-2和j-1的情况。dp[i][0] 无论i等于什么都是1种方法。需要注意的是递推公式里面。

2024-09-13 17:23:05 300

原创 代码随想录冲冲冲 Day43 动态规划Part11

1.如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;dp数组的含义是长度为[0, i - 1]的字符串text1与长度为[0, j - 1]的字符串text2的最长公共子序列为dp[i][j] 的更新有两种情况。当s[i-1] == t[j-1]时,也就是遇到相同的之后,dp[i][j]就是dp[i-1][j-1] +1(当前这个)dp也就是代表i-1个和j-1个包括的子序列的个数。

2024-09-12 16:32:36 414

原创 代码随想录冲冲冲 Day42 动态规划Part10

举个例子A[0]如果和B[0]相同的话,dp[1][1] = dp[0][0] + 1,只有dp[0][0]初始为0,正好符合递推公式逐步累加起来。但dp[i][0] 和dp[0][j]要初始值,因为 为了方便递归公式dp[i][j] = dp[i - 1][j - 1] + 1;即当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]推导出来。

2024-09-11 16:56:13 382

原创 代码随想录冲冲冲 Day41 动态规划Part9

那么dp[i][0] = max(dp[i - 1][0], dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]);初始化只有1 , 3 ,5 也就是买入的状况是有值的,所以初始化时候只需要看这些情况知道2 k。即:dp[i][2] = dp[i - 1][0] + prices[i];2次的时候一共包含了5中情况 那么k次就包含了2 k + 1种情况。2.不持有股票情况(之前就是冷冻期了,但是之后一直没买)昨天卖出了股票(状态三)这道题感觉稍微麻烦一点。

2024-09-11 01:57:53 515

原创 代码随想录冲冲冲 Day40 动态规划Part8

dp[i][0] 既然是i天时持有,那么就是之前就持有,或者今天才持有的最大值。dp[i][1]是不持有 所以是之前就不持有或者是之前持有今天刚刚卖出。最后返回dp[len-1][1] 因为卖出手头上的钱肯定比买入要多。dp[i][1] 代表第i天不持有股票手上的金额。dp[0][0] 持有所以是-prices[0]dp[i][0] 代表第i天持有股票手上的金额。dp[0][1] 不持有所以是0;

2024-09-09 17:43:33 261

原创 代码随想录冲冲冲 Day39 动态规划Part7

首先要返回的值是一个一维数组dp dp[0],dp[1]分别代表的是不取当前节点和取当前节点的最大值。1.偷第i个 那么最大价值就是dp[i-2]+nums[i]dp[0]就是当前节点的值 + 两个子节点都不取的值。如果nums的size为1 总价值是nums[0]dp[1]就是两个子节点取与不取的值的最大值在相加。dp数组的意义是在第i位的时候偷的最大钱数是多少。对于dp[0]和dp[1]的情况的递推公式来说。在调用后可以得到根节点的dp[0]dp[1]之后取这两个的最大值就是dp[i]的值。

2024-09-09 01:16:33 468

原创 代码随想录冲冲冲 Day38 动态规划Part6

那么就不能继续更新了加入j =5 有可能 j=4根本得不到 那么由dp[4] +1就不合理了 需要看类似与dp[3] +1可不可以得到。如果说任何的dp[j]为INT_MAX也就是初始值,这就说明这哥mount的数量没有得到或者得不到。其他组合的情况 只要背包容量从cost[i]开始就可以了 但是这道题并不知道cost[i]这两个部分的意思是一样的 首先dp[j]代表的是amount为j的时候 最小的硬币数量。去看dp[j]也就是看前i个dp[i]与[i,j]是否满足条件 如果都满足。

2024-09-06 17:56:01 414

原创 代码随想录冲冲冲 Day37 动态规划Part5

这道题也是组合 对于递归公式来说凑齐amount的所有方式就是 0 - amount-1的所有方式相加。还有一点是 再先背包后物品的时候 需要加一步判断 j - cost[i] 要》=0。之前反向遍历的时候 每一个d[j]没有办法用到d[j-1] 相当于每个物品用一次。第二点是 如果说求最大价值 那么先物品再背包 和先背包在物品是一样的。由于物品可以重复使用了 所以再背包容量j的维度上就可以正序遍历的。顺序无所谓 也就是组合的话 就需要先物品 后背包。排列的话 就需要先背包再物品。排列 所以先背包后物品。

2024-09-05 20:57:24 267

原创 代码随想录冲冲冲 Day36 动态规划Part4

这道题的这剩下的最后一个石头,其实就是(总重量 - 一半的重量)- 剩下一半的重量,由于一半的重量是由总重量/2得到的 所以得到的值一定是大于一半重量的,进行相减也就是最后石头的重量。所以递推公式:dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);那么考虑nums[i]的话(只要搞到nums[i]),凑成dp[j]就有dp[j - nums[i]] 种方法。不考虑nums[i]的情况下,填满容量为j的背包,有dp[j]种方法。

2024-09-04 17:01:27 1127

原创 代码随想录冲冲冲 Day35 动态规划Part3

2.只能是先物品后背包 因为一维dp的写法,背包容量一定是要倒序遍历(原因上面已经讲了),如果遍历背包容量放在上一层,那么每个dp[j]就只会放入一个物品,即:背包里只放入了一个物品。dp[j+1] 是由dp[j]迭代而来,dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。dp[i - 1][j - weight[i]] + value[i] 这个是第i个放进来。

2024-09-03 20:05:37 418

原创 代码随想录冲冲冲 Day34 动态规划Part2

第二层 j = 1 到 i/2 代表对于数字的拆分,由于两个数相乘越相似 乘积越大 所以 i = 1 到 i/2为止就是最大的情况了。2.j*dp[i-j] 大于两个的情况, j = 第一个数字 dp[i-j] 后面无论是分成几个数字相乘得到的最大值。3.dp[i] dp[i] 本身的值假如在之前j =1 得到的值要比 j =2得到的值更大 就不更新了。初始化:dp[0] 没有意义 dp[1] == 1 dp[2] ==1;递归公式:dp[i] += dp[j] * dp[i - j-1;

2024-09-02 17:25:08 363

原创 代码随想录冲冲冲 Day31 动态规划Part1

注意的是 走完其实是走到最后一个元素再之后一个 所以dp大小是cost.size() + 1 返回值当然也就是dp[cost.size()],如果dp大小是cost.size() 那就要返回最后一步的比较逻辑min(.....);2.递推公式: 第三个节点走到一下个节点的最小花费 = min(前两个的最小花费 )+ 第三个节点本身的花费。2.递推公式: 到第三个节点的最小花费 = min(前两个的最小花费 + cost[i])3.初始化 F 0 = cost[0] F 1 = cost[1];

2024-08-31 17:46:22 429

原创 代码随想录冲冲冲 Day30 贪心算法Part5

如果result最后放进来的这个右边小于等于遍历中的左边 说明可以合并那么就把result中的右边界改掉,当然如果说不能合并那就直接放进result中。从后遍历这个string,如果后一个要小于前一个,flag记录这个index并且把前一位-1;根本上就是把设置摄像头, 被监控,为监控三个情况分清 然后从底层开始遍历二叉树。整体思路为对于这个int转换为string后。最后把从flag到最后所有的都变成9。二周目重点题 mark一下。但是各种情况很难想全。先根据左端点进行排序。

2024-08-30 16:53:35 295

原创 代码随想录冲冲冲 Day29 贪心算法Part4

当右边界 == 遍历的index的时候 就相当于在这个index时前面所有的字母都不会在后面出现。全部被包起来了,那么就更新right, right - left +1 就是分第一个的结果。原因是修改后就是看 第三个到第是不是和前两个有重叠 第二个的右边界就不重要了。跟上面的相似 唯一不同的是上面如果是边界相等也相当于可以中一箭。只要是第三个没有办法和前两个右边的最小值重叠 就一定要多一箭。这时候修改后一个的右边为前一个右边和后一个右边中更小的那个。如果前一个的右边比后一个的左边小 说明出现重叠了。

2024-08-29 16:11:02 257

原创 代码随想录冲冲冲 Day28 贪心算法Part3

假如所有的补给小于所有的消耗 这就说明 无论从哪个点开始 都走不到一圈 所以return -1;一旦补够了 这就意味着 我从这个补够的点开始跑 相当于是可以先存下一些油给后面 这样就够了。假如这个值大于0 这就说明 从0这个位置开始跑 跑到最后一直都有足够 直接返回0就行。当上面第二种情况值小于0,这就说明从0开始跑欠了x的油。首先先从左向右排 也就是右边比左边成绩高时 糖果就多1。再从右边向左边排 如果左边比右边大 糖果就多1。收到10块 如果没有5块了 就false。有的话 就10 +1 5 -1。

2024-08-28 18:12:55 310

原创 代码随想录冲冲冲 Day27 贪心算法Part2

如果没有那个-1 如果上一次最大值刚刚好走到最尾,这时候最后一个数就会进入if从而得到错误答案。需要注意的是下方forloop的范围,由于这道题前提条件是一定可以走到最尾。所以少设定两个值 一个是当前要走到的举例 另一个是下一个阶段要走到的举例。在这之后,看一下剩下没用的次数是否为偶数,如果是偶数就没所谓不用管了。直到走到当前阶段的最尾之后,把下个阶段的距离替换给这个阶段的距离。看到最直观的想法就是在高卖低买,也就是p高 - p低。更加形象的说就是每天的交易,亏了不算,赚了算。之后把所有求和就可以了。

2024-08-27 20:22:54 404

原创 代码随想录冲冲冲 Day24 回溯算法Part4

用use[i] = true去避免当前重复被选择, 比如1 ,2 ,3结果选出来112这种的。当次数大于0时候是说明 到达的机场还可以往外飞 等于0的时候就代表结束了 这样可以避免循环情况。1.需要一个判断的函数, 让加上之后横纵向上45度和向上135度都没有皇后,不看向下的是因为。这个比起上面的区别是 这道题会有重复的数 但是得到的排列不能一样 有重复的数就要数层去重。1.要有这么一个map去记录出发的机场 到达机场 和 到达机场的次数。由于数组中存在重复的数字,需要去重,这也是个数层去重。

2024-08-27 01:38:52 456

原创 代码随想录冲冲冲 Day26 贪心算法Part1

重要的是pre= cur一定要是在if中的如果不是的话 在上坡时出现相同数的情况就会被计算进去出现问题。2.用一个count去更新当前的累加数组和,当count要大于result去更新result。当出现pre<=0,cur >0 或者 pre>=0, cur <0 的情况 个数+1。但当count小于0 也就是最后一个时负数 后面的数要去补前面的窟窿 这样累加的和肯定小。2.用最小的饼干去喂胃口最小的孩子 这样就是正向遍历。1.用最大的饼干喂胃口最大的孩子 这样就是反向遍历。这道题很简单 分两种。

2024-08-26 02:22:09 386

原创 代码随想录冲冲冲 Day23 回溯算法Part3

2.停止条件 当pointnum = 3 时 ,继续去判断最后一段也就是start ~ 最后这个范围。3.单层递归逻辑,当前valid的情况下,修改s在判断的后一个位置+上 ‘.’在递归回溯时,首先要把之前的标记‘.’去掉,之后也要把pointnum减少掉。子集的话 大部分逻辑是跟正常的回溯一致的。如果把used[i-1] == True 就会变成树层不去重但是树枝去重。同时pointnum要加上1 也就是说明确认一个范围了。如果把used去掉 就会变成树枝,树层都进行去重。主要问题是在树层上去重。

2024-08-23 17:17:02 260

原创 代码随想录冲冲冲 Day22 回溯算法Part2

3.for loop部分,i = start到数组尾进行,当当前数组(start,i)为回文串时把这一段放进result中。当i小于数组长度并且candidates[i] + sum <= target(剪枝)时for loop。这道组合总和特点是可以在一个无重复元素的整数数组中,每个数组被无限次选取的情况下组合出。这道题的特点是 nums中可能会有重复的数 得到的组合只能唯一 所以要在树层上进行去重。在 i== start 之一层中,i经过变化会代表之一层中的每一个其他数字。如果这里写成i= 0;

2024-08-22 20:32:09 286

原创 代码随想录冲冲冲 Day21 回溯算法Part1

这个start index是用来看每次遍历的头是哪个 例如1为头组合 2为头组合...同样当递归返回上册之后 要把刚刚的值pop出去 这样就避免了1234这样的情况。停止条件是当记录的path的size和要求的k是一样的时候。k - path.size() 剩余可以放入的个数。path.size()是当前path集中的个数。输入输出/终止条件/单层递归回溯逻辑。这里叠加值sum也要在回溯的时候复原。这里的+1是为了保证左边可以放进来。其余的剪枝逻辑都是一样的。只是跟改了返回时的条件。跟上面的情况是相似的。

2024-08-21 17:23:51 263

原创 代码随想录冲冲冲 Day20 二叉树Part8

到cur之后0+cur的值 同时更新cur的位置 之后就是按照顺序去遍历累加完就行。所以直接去递归右面的树,这里得到的node会之后放到删除节点上层节点的右树去。1.小于a的时候 那么下方树就不用在看左树了 一定会更小肯定也不在范围内。之后对于上层的树 使用left和right来接住下方的返回值就可以了。由于二叉搜索树的性质,如果说删除节点在不在【a,b】之中有两种情况。右左中的顺序去遍历,这里需要一个pre来做双指针,pre一开始为0。前序来操作,首先找到数组的中间值这个值就是root。

2024-08-20 19:46:53 286

原创 代码随想录冲冲冲 Day19 二叉树Part7

逻辑很简单,当到了一个节点是null的时候,建立一个node并把这个node返回上来。至于到底接在哪 要看删除的值和节点的情况 如果值比节点大就接在右边 相反的话是左边。4.如果是左右都有的情况首先要把右边树记录下来,然后找到右边树中最左侧的节点。3.当删除的节点有左没右的时候,那么就要把左边边接到另一个树的对应位置。2.当删除的节点有右没左的时候,那么就要把右边接到另一个树的对应位置。再把原本的左节点接过去之后把要删除的节点替换成右树的节点。1.当删除的节点就是叶子节点时 直接直接删除。

2024-08-19 20:33:36 322

原创 代码随想录冲冲冲 Day18 二叉树Part6

这道题由于是二叉搜索树,如果使用中序搜索,那么就可以得到一个递增的数组,这样只要双指针去找最小值就行了。对于最小值来说其实就是中节点和左右树的节点差值,之后刷新最小值。所以这里使用双指针也就是找一个pre节点,首先中序遍历,找到最左侧节点这是标记pre之后回到上一次,取中节点和pre的差。当节点是q或者p的时候返回上去,对于中节点的逻辑 操作,如果左右非空 说明左右既包括p也包括q,那么直接返回这个中节点。如果左右里面有左,那就把左返回上去,如果有右就把右返回上去,如果都没有当然也就返回null回去。

2024-08-19 16:02:47 259

原创 代码随想录冲冲冲 Day16 二叉树Part4

因为并没有对于中节点处理的操作所以下面只有左右去递归左右就可以了 但是存在要回溯回来进行 别的分支的探索 所以层数需要增加后再减少 也可以跟图中那样直接写在一起。2.停止条件 当左右子节点都是NULL时就是根节点 , 如果说这个值是大于存好的最大值的就跟新这个节点的数值还有具体再第几层。后序数组由于左右在一起,所以根据中序数组拆分完的左树size去差分后序的左,剩余就是后序的右了。很有意思 通过后序数组确认根节点 再用找到的根节点去中序数组中找左右树。根节点的数值一直等于后序的最后一个数值。

2024-08-16 16:48:18 282

原创 代码随想录冲冲冲 Day17 二叉树Part5

返回二叉搜索树的node,当root==null或者值相等时候返回node。对于这个最大值的左树就要看从left 到 最大index的位置。验证二叉树其实就是左右中去递归,设定一个动态的maxvalue。只有当条件一直满足的时候才会继续,一旦不满足就false;首先当出现t1没有的时候 就返回另一棵树t2的同一个位置。当root的值要比val大,就去找左边node中的值。两个都没有的时候 根据上面的逻辑会cover到。同理t2没有的时候 就返回t1的同一个位置。相反的话就找右边node中的值。

2024-08-16 01:44:09 238

空空如也

空空如也

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

TA关注的人

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