自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 问答 (3)
  • 收藏
  • 关注

原创 代码随想录算法训练营第21天 | 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

取数组中间点为分割点,然后将左右两边作为两个区间,这两个区间来构造左右子树。反中序遍历一遍,返回结点的值是上一个结点的值加上当前结点的值。

2026-04-15 11:06:24 52

原创 代码随想录算法训练营第20天 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

插入操作根据二叉搜索树的性质,一定能在叶子结点中找到插入的位置。当找到叶子结点的时候,就定义一个节点变量,将这个节点变量返回。当这个节点的值大于这两个目标值,就遍历左子树。当这个节点的值小于这两个目标值,就遍历右子树。遍历到叶子结点的时候就可以插入元素了。当插入的值大于结点值,就遍历左子树。当插入的值小于结点值,遍历右子树。当处于中间的时候就是公共祖先。

2026-04-14 20:57:40 209

原创 代码随想录算法训练营第18天 | 530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236. 二叉树的最近公共祖先

然后比较count和maxCount,如果count == maxCount ,则结果集加入当前结点的值,如果>,则将结果集清空,并且将当前maxCount赋值为当前count,结果集记录当前值。中:当pre为空的时候,count = 1,刚开始,当pre不为空,并且 cur的值等于pre的值,count + 1。要找公共祖先,得自底向上查找,即回溯的过程,使用后序遍历。终止条件,结点为空,则是叶子结点,返回空。当左子树不为空,但右子树为空,返回左子树。当左子树为空,右子树不为空,返回右子树。

2026-04-14 10:02:31 245

原创 代码随想录算法训练营第17天 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

遍历结点,终止条件,如果第一个二叉树为空,则遍历第二个二叉树,如果第二个二叉树为空,则遍历第一个二叉树(等于都为空)单层递归逻辑是,如果下标大于0,说明这层数组中间截断,左边还有值,还能构建左子树,构建一个数组接着遍历。中:当这个值小于结点值时,最小值等于结点值,大于的话就不满足二叉搜索树,返回false。当值大于目标值的时候,遍历左子树,小于目标值,就遍历右子树。终止条件:这一层数组长度只有1了,说明到了叶子结点了。当下标小于数组最大时,构建右子树。中序遍历,因为中序遍历的结点值是从小到大的顺序。

2026-04-13 19:57:01 191

原创 代码随想录算法训练营第16天 | 513.找树左下角的值、 112. 路径总和、106. 从中序与后序遍历序列构造二叉树

递归的思路即确定终止条件,当遇到叶子结点并且发现值已经被减到0了,就将这条路径存入结果。到了叶子结点,值不为0,就证明没找到,直接返回即可。递归的思路即确定终止条件,当遇到叶子结点并且发现值已经被减到0了,就返回true,能找到这条路线。到了叶子结点,值不为0,就证明没找到。确定单层递归逻辑,传递的是孩子结点和减掉孩子结点的那个值,减掉以后回溯的时候需要加回来。确定单层递归逻辑,传递的是孩子结点和减掉孩子结点的那个值,减掉以后回溯的时候需要加回来。用层序遍历,遍历到最后一行的第一个元素取出来即可。

2026-04-13 15:14:40 174

原创 代码随想录算法训练营第15天 | 110.平衡二叉树、 257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

递归返回值的条件:当这个节点的左孩子有值,但是左孩子是叶子节点即可记录这个左孩子的值。个人认为dfs比较容易理解。将路径作为节点值向下传递。平衡树,左右子树的高度差小于等于1。简单的记录节点个数,遍历一遍即可。递归终止条件:节点为空。

2026-04-01 16:14:56 246

原创 代码随想录算法训练营第14天 | 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、 111.二叉树的最小深度

因为需要对称,判断左子树的左孩子与右子树的右孩子是否相等,左子树的右孩子与右子树的左孩子是否相等,其中一个为空都是false,都为空那为true。递归的话就是后序遍历,先找左子树最深,再找右子树最深,最后比较得到max,进行加1。层序遍历思路清晰,当遍历到某一个结点左右孩子都是空就是当前深度。使用层序遍历,一层一层遍历,每一层深度加1。将这些情况全部排除后就是值相等情况。对自己的左右孩子进行交换。采用后序遍历的递归思路。

2026-03-26 20:47:57 180

原创 代码随想录算法训练营第13天 | 二叉树的递归遍历、迭代遍历、层序遍历

左孩子为空,就弹出一个元素,此时弹出的是当前元素。发现右孩子也为空了就向上查找父节点,然后父节点发现左孩子为空弹出父节点,指向右孩子,右孩子不为空将这个元素加入。迭代法的思路是,先遍历整个二叉树,只要没有到达最深的一层,就一直将左孩子加入,直到树最左边的孩子加入进来。但因为栈的后进先出原则,在循环中需要先将右结点放入栈中,再放左节点,这样弹出元素的时候就是先弹左边再弹右元素。迭代法的思路是与前序类似,前序读元素是中左右,后续是左右中,将前序存储的方式先变成中右左,后面再逆转就行。思路是广度优先搜索。

2026-03-24 21:07:19 232

原创 代码随想录算法训练营第11天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值 、347.前 K 个高频元素

思路是单调的队列,自定义一个队列,让他的push方法是将前面所有比需要push进来的值小的全部给踢出队列,因为我们需要的是一个递减的队列,在之后的取值中只需要取队列的顶部在每一个区间,所以push的时候将前面比当前值小的全部踢掉。pop操作,因为我们的队列是跟滑动窗口一样大小,当我们发现滑动窗口移动时,滑动窗口的最前面的那个值跟我们队列的头元素相等了,那么我们这一次的窗口移动是会将头元素给踢掉,那么就放掉头元素,下一个值就是当前区间的最大值。最后队列的最大值就是双端队列的头部。

2026-03-19 14:11:27 214

原创 代码随想录算法训练营第10天 | 232.用栈实现队列、 225. 用队列实现栈、20. 有效的括号、1047. 删除字符串中的所有相邻重复项

与上一题类似,也是将元素放入栈中,当发现下一个元素与栈顶元素相等时,就取出一个元素。出栈就是让这一个队列的值循环起来,就是先push进顶部的值,然后到size-1的元素时,就将这个值获取,并弹出即可。想好三种情况,一种是类型不匹配,一种是匹配发现栈内没东西了;如果要查找栈顶元素,就是类似于出栈,但是最后一个值是获取前先push进去,再获取并弹出。出栈时,将In栈的元素全部放入Out栈,然后获取Out栈的顶部,再把顶部值弹出。使用栈存储元素,将每一个括号的相反存入栈内,方便比较。入栈时直接放入In栈。

2026-03-18 16:42:15 207

原创 (代码随想录算法训练营第9天 | 151.翻转字符串里的单词 、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串)

[TOC](代码随想录算法训练营第9天 | 151.翻转字符串里的单词 、卡码网:55.右旋转字符串、28. 实现 strStr()、459.重复的子字符串)

2026-03-17 18:01:09 391

原创 代码随想录算法训练营第8天 | 344.反转字符串、541. 反转字符串 II、替换数字

一个指针指向第一个数,一个指针指向最后一个数,然后直接调换,swap,循环终止条件,left > right。可以想到循环的时候直接跳2k个字符进行循环,因为他的规则是每2k个字符然后判断反转,若小于k个就将全反转。首先循环一遍判断有多少个数字,然后对数组进行扩充,最后从最后一个数向前替换。只需要判断最后一个区间的右开端点要跟n取最小值,防止下标越界。与上一题类似,但是规则比较复杂,需要进一步模拟规则。暴力做法,直接reverse。

2026-03-11 14:02:40 199

原创 代码随想录算法训练营第7天 |454.四数相加II 、383. 赎金信、15. 三数之和、18. 四数之和

剪枝的细节不同,三数相加,只需要判断第一个数是否大于0即可,因为排序完了之后如果第一个数都大于0了,那么target=0的话一定是做不到的,但是四数相加,如果第一个数大于target值,但是target是负数的话,第一个数加第二个数是有概率等于target值的。对于第一个数,判断是否大于0,来决定是否剪枝,因为第一个数就大于0的话,那么这三个数一定不能等于0。这两个指针的去重操作,也是后指针如果等于前面一个数,就指针前移,前指针如果等于后一个数,指针后移。与三数相加类似,但有许多细节不同。

2026-03-10 20:54:59 368

原创 代码随想录算法训练营第6天 | 242.有效的字母异位词 、349. 两个数组的交集、202. 快乐数、1. 两数之和

看题目是26位字母,所以只需要开一个26位的数组对应每一个字母下标的个数,遍历字母,将字母对应的下标加一,遍历第二个字母,将字母对应的下标减一,最后遍历这个数组,如果出现数组元素不等于0,说明有差异。然后为什么会讲元素值作为key,是因为我们需要遍历map去找到目标值减去当前值能不能在map中找到对应的值,所以直接将元素值作为key值,方便查找。这道题就是简单的将第一个数组的值存入集合中,然后再遍历第二个数组,若在集合中找得到对应的值,就是交集,存入结果。若没找到就将这个值存入map。

2026-03-10 11:08:59 264

原创 代码随想录算法训练营第4天 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、160.链表相交、142.环形链表II

快慢指针,快指针两步两步走,慢指针一步一步走,若是环形则等快慢指针相遇,记录当前指针位置,然后设另一个指针指向头结点,再次同步移动这两个指针,等这两个指针相遇则是环形入口。设计一个快指针先走n步,然后慢指针再跟着快指针一起走,等快指针等于空值时,慢指针也就到达了需要删除的点。其次令第一个结点等于第二个结点,然后将原第一个结点指向的下一个结点变成原第二个结点指向的下一个结点。再将新的第一个结点指向原第一个结点,最后移动当前结点到新第二个节点位置。所以需要将慢指针向前移动一步,那么就将快指针先走n+1步。

2026-03-09 16:02:07 177

原创 代码随想录算法训练营第3天 | 203.移除链表元素、707. 设计链表、206.反转链表

然后就开始反转,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点,然后将cur -> next 指向pre,再移动pre和cur指针向前移动。若要删头结点,需要先使用一个临时结点将头结点改变成下一个结点,再释放。非头结点就只需要遍历链表,找到需要删除的结点进行删除即可。首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。单链表删除结点的操作,可以分为两种情况:一种是删除头结点,一种是其他结点。删除链表的操作是将前一个结点的指针指向第二个结点。

2026-03-08 15:10:01 211

原创 代码随想录算法训练营第2天 | 209.长度最小的子数组、59.螺旋矩阵II、区间和、开发商购买土地

这道题他的土地划分是简单的一道切,所以当得到了二维数组的前缀和之后,就可以直接循环每一列和每一行,将总和减掉这一行切掉的值,再加上由于是比较差值,所以减掉一次是另一半的和,那么减掉两次就是差值了,所以使用绝对值函数abs来判断差值大小。首先也是套公式:二维数组前缀和公式:s[ i ][ j ] = s[ i - 1 ][ j ] + s[ i ][ j - 1 ] - s[ i - 1 ][ j - 1 ] + a[ i ][ j ]区间和a b即:S = s[b] - s[a-1];

2026-03-07 20:20:33 174

原创 代码随想录算法训练营第1天 | 704.二分查找、27.去除元素、977.有序数组的平方

的情况:我们就思考区间范围能否取到闭区间,若能取到右区间,那右指针就可以取nums.size()-1,那循环判断就可以取左右指针相等,更新右指针的时候,因为右指针是闭区间,已经判断了当前的中间值是大于目标值了,所以右指针可以向前取一位,即middle-1.的情况:若不能取到右区间,那右指针就可以取nums.size(),那循环判断就不可以取左右指针相等,更新右指针的时候,因为右指针是开区间,已经判断了当前的中间值是大于目标值了,所以右指针就取当前mid值,即middle.

2026-03-04 15:51:15 215

原创 数组的基本讲解(针对刚入大一的普通院校计算机学生)

数组的基本介绍与使用!

2022-11-10 17:34:46 289 1

空空如也

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

TA关注的人

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