- 博客(51)
- 收藏
- 关注
原创 热门面试题第14天|Leetcode 513找树左下角的值 112 113 路径总和 105 106 从中序与后序遍历序列构造二叉树 (及其扩展形式)以一敌二
首先回忆一下如何根据两个顺序构造一个唯一的二叉树,相信理论知识大家应该都清楚,就是以 后序数组的最后一个元素为切割点,先切中序数组,根据中序数组,反过来再切后序数组。可以使用前序遍历(当然中序,后序都可以,因为本题没有 中间节点的处理逻辑,只要左优先就行),保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。图中可以看出,遍历的路线,并不要遍历整棵树,所以递归函数需要返回值,可以用bool类型表示。如果使用递归法,如何判断是最后一行呢,其实就是深度最大的叶子节点一定是最后一行。
2025-03-25 23:50:37
755
原创 热门面试题第13天|Leetcode 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和 222.完全二叉树的节点个数
我们用StringBuilder来拼接字符串,然后我们开始循环遍历path将其存入sb中,注意不要遍历到最后一个元素,因为题目要求“->”,所以我们遍历到倒数第二个元素即可,然后将再单独添加卒子后一个元素,最后将拼接的sb添加给res,然后结束方法。当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。当然是其左子树高度和其右子树高度的差值。节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节点的左孩子为左叶子节点。
2025-03-24 16:00:41
849
原创 热门面试题第12天|Leetcode 226.翻转二叉树 101. 对称二叉树 104.二叉树的最大深度 111.二叉树的最小深度 (内含热门面试题)
那么使用后序遍历,其实求的是根节点到叶子节点的最小距离,就是求高度的过程,不过这个最小距离 也同样是最小深度。左节点,右节点分别为空时,我们只需要考虑另一边的最小深度的情况就行,两者都不为空的时候,我们在考虑取最小值+1。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。高度从下到上,深度从上到下,但是求最大深度,其实和求最大高度的结果是一样的。本题依然是前序遍历和后序遍历都可以,前序求的是深度,后序求的是高度。比较的是两个子树的里侧和外侧的元素是否相等。
2025-03-23 21:29:15
727
原创 热门面试题第11天|Leetcode刷题一篇文章教会你二叉树 递归遍历 迭代遍历层序遍历(内含热门面试题)
递归遍历 (必须掌握)二叉树的三种递归遍历掌握其规律后,其实很简单前序中左右,我们直接将中的val加入进,然后再递归左右子树即可后序和中序也是同理,只是顺序不同,但遍历的节点对象为null时,直接退出方法就行,我们直接看代码。迭代遍历我们来看迭代的思路我们在进行前序遍历的时候,按照的是中左右的顺序,思路如下我们从根节点开始读取,每读取一个根节点,将其存入栈,然后每次取出的时候将取出的节点的右左节点依次放进栈里面即可我们来看代码。
2025-03-13 22:34:52
543
原创 热门面试题第十天|Leetcode150. 逆波兰表达式求值 239. 滑动窗口最大值 347.前 K 个高频元素
输入: ["10", "6", "9", "3", "+", "-11", " * ", "/", " * ", "17", "+", "5", "+"]此时我们需要一个队列,这个队列呢,放进去窗口里的元素,然后随着窗口的移动,队列也一进一出,每次移动之后,队列告诉我们里面的最大值是什么。有的同学可能会想用一个大顶堆(优先级队列)来存放这个窗口里的k个数字,这样就可以知道最大的最大值是多少了,暴力方法,遍历一遍的过程中每次从窗口中再找到最大的数值,这样很明显是O(n × k)的算法。
2025-03-09 20:58:13
970
原创 代码随想录算法训练营第九天|Leetcode 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
因为队列是先进先出,我们在push的时候直接将元素push进输入栈就可以,但是在pop或者peek的时候,如果输出栈为空,需要先将输入栈 的元素压入输出栈,再将输出栈的元素做对应的操作,这样才实现了先进先出的性质。在stackout里面有元素的时候,我们不用再将stackin的元素push进去,因为已经是按照顺序的,我们只需要等stackout的元素全部处理完再将stackin的元素处理即可。给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
2025-03-09 17:00:43
1211
原创 代码随想录算法训练营第八天|Leetcode 151.翻转字符串里的单词 卡码网:55.右旋转字符串 字符串总结 双指针回顾
建议:这道题目基本把 刚刚做过的字符串操作 都覆盖了,不过就算知道解题思路,本题代码并不容易写,要多练一练。我们这道题的思路是,先将整个字符串反转,结束之后再定位每一个单词,然后再将单词进行反转,思路为什么是这样子的呢。我们思路和之前一样,先整体反转,然后反转前n个字符,再反转剩余字符,为什么这样做呢,因为可以。建议:题解中的解法如果没接触过的话,应该会想不到。151.翻转字符串里的单词。卡码网:55.右旋转字符串。
2025-03-09 12:30:25
312
原创 代码随想录算法训练营第七天|Leetcode 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字
先对数组进行扩容,在遍历字符串的时候出现数字字符就将长度+5处理,然后根据扩容的数组长度去new一个新数组,再将输入的字符读取进创建新数组对应的位置,再从后往前进行遍历,,碰到数字就从最后一位开始往前遍历,没碰到就把字符赋值给对应的位置。我们先理解一下题目意思,如图所示,在图中画了个字符串,令k=3,2k=6,我们将字符串的2k范围内的前k位进行翻转,然后再从2k+1的地方进行上述操作,如果长度<k,我们就不变,途中剩下gh均<k,所以我们需要反转。当然我们也可以用最基础的temp完成交换操作。
2025-03-05 20:54:34
396
原创 代码随想录算法训练营第六天|Leetcode454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和
15. 三数之和建议:本题虽然和 两数之和 很像,也能用哈希法,但用哈希法会很麻烦,双指针法才是正解,可以先看视频理解一下 双指针法的思路,文章中讲解的,没问题 哈希法很麻烦。和之前我们遇到的两数之和不同,两数之和可以很快的通过哈希表完成作答两层for循环就可以确定 两个数值,可以使用哈希法来确定 第三个数 0-(a+b) 或者 0 - (a + c) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。
2025-03-05 16:54:54
927
原创 代码随想录算法训练营第五天|Leetcode1. 两数之和,349. 两个数组的交集242.有效的字母异位词 202. 快乐数(内含Hash知识点详解)
哈希数组更加适用于频繁查找和计数统计的操作,我们来看思路,我们创建两个hash数组,将两个输入数组中的值分别存入哈希数组中,这样数组的索引作为键,数组的值作为计数次数,然后我们得到了两个哈希数组,只要判断相同索引的两个哈希数组的值是否都大于0就行,如果都大于0,就说明这个元素是重复的,我们再创建一个动态数组吗,因为具备扩容的功能等,但是最后返回的时候还是需要创建一个普通数组,因为题目要求的返回方法是int,我们来看代码。建议大家先看视频讲解,然后尝试自己写代码,在看文章讲解,加深印象。
2025-03-04 22:33:18
898
原创 代码随想录算法训练营第四天|Leetcode203.移除链表元素 707.设计链表 206.反转链表
24. 两两交换链表中的节点用虚拟头结点,这样会方便很多。本题链表操作就比较复杂了,建议大家先看视频,视频里我讲解了注意事项,为什么需要temp保存临时节点。题目链接/文章讲解/视频讲解:我们通过图解看的更加清晰一点curr指向2,再指向1,再指向3,最后将这个绳子拉直,就达成凉凉交换 的效果还是需要一个哨兵节点,因为需要通过它定位后面的交换操作为了让相邻的两个节点交换,我们需要将前驱节点设置在最近节点之前,我们把这个结点成为curr,如果curr.next!
2025-03-03 00:00:49
854
原创 代码随想录算法训练营第三天|Leetcode203.移除链表元素 707.设计链表 206.反转链表
203.移除链表元素建议: 本题最关键是要理解 虚拟头结点的使用技巧,这个对链表题目很重要。我们心里一定要清楚一点,就是链表的删除操作需要知道前驱和后继,只有知道了这两点才可以进行删除操作,curr是指针,用来对链表进行操作。
2025-03-02 18:32:50
421
原创 代码随想录算法训练营第er天|Leetcode209.长度最小的子数组59.螺旋矩阵II
思路是滑动窗口,在数组的第一个元素位置有一个起始指针和一个终止指针,起始指针不用移动,终止指针依次移动,当每次移动终止指针的时候计算一下起始指针到终止指针的这段距离之间的元素和,大于等于sum的时候进入while循环,更新result为当前区间的数组长度和之前记录过的数组长度最小值,同时之间记录的总和要对应减少,然后再更新起始指针,最后返回result。,这个滑动窗口看文字讲解 还挺难理解的,建议大家先看视频讲解。: 本题关键还是在转圈的逻辑,在二分搜索中提到的区间定义,在这里又用上了。
2025-03-01 21:17:18
259
原创 代码随想录算法训练营第一天|Leetcode704. 二分查找,27. 移除元素 977.有序数组的平方
704. 二分查找题目建议: 大家今天能把 704.二分查找 彻底掌握就可以,至于 35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。代码实现(版本一)左闭右闭区间我在手撕这段代码的时候前面几次提交都报错超时,要注意把m写在循环外面这里左右都是闭区间,所以在二分更新节点的时候直接-+1,并且j和i可以相等。
2025-02-26 23:46:33
683
原创 二叉树的前中后序遍历(非递归)
我们先来看代码按照逻辑是先打印再压入栈,因为我们遍历完左边的时候,需要一步一步寻找遍历的路径找回去,为了记住来时路,我们需要通过栈来存储。我们将遍历的值直接打印并存储在栈里如图所示,我们先将1压入栈,然后陆续遍历2,4,接着我们当遍历到4之后发现left为null,我们再从栈中退出4去查找4的right,因为符合值左右,发现right没有,我们继续pop,发现2也没有right,直到pop到1有right然后进行右边的遍历,规则一样。
2024-12-03 14:14:46
398
原创 用环形数组实现队列(多种高级方法,由浅入深)
同普通数组实现的队列相比,普通数组的头结点和尾节点都是固定的,在进行移除的时候如果移除了一个节点,后面所有节点都需要进行移除操作,需要的时间复杂度更高在环形数组中,确定了头尾指针的环形数组很好地解决了这一点我们来看具体思路。
2024-11-07 20:15:12
1143
原创 基础数据结构——队列(链表实现)
和之前创建链表相同,我们需要设置一个哨兵头结点 此时它既是head也是tail。后面进行添加操作的之后将每次新加的节点设置为tail,并且指向head。我们在这个类中将每次构造的队列对象的tail节点都指向head节点。先来写队列类和它内部Node类。我们接下来实现队列的基本操作。接下来我们实现各个功能操作。
2024-11-07 16:53:05
475
1
原创 通过mybatisplus实现注册用户的接口基础上实现根据角色id查询功能
为了使 Spring Boot 程序能够在路径上通过查找用户的 ID 返回对应用户的信息,我们需要通过以下几个步骤修改代码。
2024-11-06 09:24:04
562
原创 基础数据结构——栈(一篇博客教你搞定)
计算机科学中,stack是一种线性的数据结构,只能在其一端添加数据和移除数据。习惯来说,可以移动的一端称为栈顶,另外一端不能操作的数据称为栈底,就如同子弹弹夹或者生活中的书可以理解为后进先出。
2024-11-05 15:18:52
973
原创 springboot入门学习笔记2(连接mysql,使用mybatis,plus等)
Service注解用于标识类是一个服务层组件。类扩展了类,这意味着它继承了 MyBatis-Plus 提供的服务层实现类的功能。类实现了接口,它必须提供接口中定义的所有方法的实现。
2024-10-30 08:00:00
1118
原创 一篇文章见你拿下多路递归——斐波那契问题
从第三个元素开始,每个元素的值等于前两个元素的和本质其实也是一个递归操作,话不多说我们直接上代码。上述代码不难理解,我们接着继续分析。
2024-10-18 11:33:07
408
原创 基础数据结构——插入排序递归
low为改数组中还没有排序的索引位置,t代表该索引位置的值我们只需要将low与前面排好序的数组比较,找到第一个比t小的值,将t排在它后面即可未排序部分不断缩小,直到i缩小到0或者low的前一位值已经比low的值小,此时退出查找我们来看代码。
2024-10-18 09:15:48
374
原创 喝水也要看的 Synchronized互斥锁,线程死锁,释放锁教学(内含线程零基础快速入门教学)
1,java语言中,引入了对象互斥锁的概念,来保证数据操作的完整性。2,每一个对象应该对应一个可称为“互斥锁”的标记,这个标记来保证在任一时刻,只能有一个线程访问该对象。3,当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问4,同步的局限性:导致程序的执行效率要降低5,同步方法(非静态)的锁可以是this,也可以是其他对象(要求是同一个对象)6,同步方法(静态的)的锁为当前类本身。
2024-10-16 09:33:06
1104
原创 基础数据结构——用递归完成冒泡排序
冒泡排序就是通过第一个元素依次与后面的元素进行比较,如果第一个元素比第二个元素大,那我们进行两个元素的交换,再调用这个交换函数,完成递归冒泡排序。我们进入迭代比较,每完成一次交换循环,开始继续调用,当末尾指针指向0索引的时候终止调用。在上述代码中,我们传入两个参数,一个数组一个末尾指针。如上完成了一轮冒泡排序,我们来根据思路完成代码。并且实现了一个sort方法,便于用户调用。
2024-10-11 13:42:29
279
原创 基础数据结构——双向环形链表(带哨兵节点)
双向环形链表带哨兵,这时哨兵既作为头,也作为尾。和之前一样,我们先设立通用节点Node的属性以及有参构造接着我们来写哨兵节点。因为哨兵节点只有在实例化之后才可以操作,所以我们先实例化一个初始哨兵节点,再通过构造方法给该哨兵节点完成环形连接。代码如下;这样我们就创建了双向环形链表。
2024-10-10 14:33:10
415
原创 基础数据结构——双向链表(带哨兵节点)-(一篇博客教你拿捏所有双向链表常用操作)
如上图所示,双向链表就是可以通过头节点依次指向尾节点,也可以通过尾节点反过来查找头结点。所以在编写双向链表的时候,我们需要设置两个节点,因为写的是哨兵版本,我们可以通过构造函数使设置的两个节点赋予值,并完成指向操作,我们来看代码。
2024-10-09 22:34:10
405
原创 基础数据结构——单向链表进阶(哨兵节点)
我们先来看原来的代码Node p;for(p=head;p.next!=null;因为head不为null了,所以也可以删除if逻辑,我们来看改进后的代码Node p;for(p=head;p.next!=null;我们接下来对于代码进行测试我们通过之前写过的迭代器进行遍历打印,结果如下我们发现在遍历的时候我们将哨兵节点也进行了打印,所以我们要对遍历进行修改。
2024-10-09 12:39:09
907
原创 基础数据结构——单向链表(一篇博客教你掌握单向链表所有常用操作)
思路是查找到p.next为空,那么p就是最后一个节点如果链表为空,那我们返回null即可。
2024-10-08 21:54:49
917
原创 一篇文章教你用java开发一款美颜相机(由浅入深)
File 类创建的对象只会保存文件 或者文件夹基础信息 ,不包括文件内容基础信息路径 名字 文件格式。内存中的一张临时图片 ,他提供了很多丰富的功能便于提取设置这张图片的数据。原理不难,其实就是将之前存储像素rgb值的数组进行遍历在坐标上绘制就行,我们来看代码。我们先去实现一个对于图片进行读取的和转化为每一个坐标所对应的图片的像素的方法。根据点击的按钮 实现不同的图像处理效果并且绘制出来。实现了图像处理方法,接下来我们来实现图片滤镜方法。对象 保存为一个电脑上的图片文件。
2024-10-02 21:04:33
516
原创 java中的函数式编程
我们来看几道题目在这四个表达式中第一个表达式的a,b少了括号,因为含有两个元素,所以需要有括号第二个正确第三个括号里面要么a,b都不写参数类型,要么a,b都写,所以不正确第四个 如果标注数据类型的话就算一个参数也需要括号,要么就不写数据类型。
2024-09-29 10:44:54
278
原创 基础数据结构——动态数组(一篇博客教你拿捏一维数组操作)
在研究动态数组的插入实现,如果是将该插入元素插入到数组末尾,也就是尾插法在实现了尾插法之后,我们想实现可以进行在数组里面各个位置插入的方法我们的思路是先将原数组进行拷贝,从要插入的index开始将之后的所有元素进行复制,复制到塔本身index+1的下标位置,然后再把要插入的元素放在空出来的index上注意:arraycopy的参数(被拷贝的数组,开始拷贝的起始坐标,被复制的数组,被复制到的数组开始复制的初始下标,复制的长度)我们对于上述代码进行简化。
2024-09-26 22:44:18
858
1
原创 基础数据结构——二分查找真题(leecode真题,快速上手!)
在学习了之前的几种二分查找的学习之后,我们可以通过题目进行实战演练我们先来看题目一。
2024-09-24 12:28:17
305
原创 基础数据结构——二分查找进阶(新手必看!)
在之前学习的二分查找中,我们全部是按照没有重复元素的顺序查找二分那在处理有重复元素的时候我们又该如何进行查找呢我们回到之前写过的二分查找基础版我们不难发现,当该函数查找到第一个待查找元素的时候就会返回该元素,如果在查找一个含有重复元素的数组,其返回的也是第一个查找到的元素所在的索引。我们能不能改进一下需求呢 比如返回重复元素中最左侧的元素查找重复元素中最左侧的二分查找(leftmost)我们先来看思路(蓝色为数组,紫色为数组索引值我们选择的目标值为4。
2024-09-22 16:09:31
1127
原创 基础数据结构——二分查找java版
我们来解读一下这个代码 low依然是首指针,high是末尾指针,指向数组的第一个元素和最后一个元素,后面的操作和之前我们手写的二分查找一样,唯一不同的是返回值出现了-(low+1)因为如果插入值low为0的时候,我们无法通过正负形来得知为查找到还是没有查找到,所以我们需要通过-1来使插入值为0的时候返回负数,这样子可以更加直观的得出结论。我们对此进行一个解读,如果要查找的target包含在数组中,那么返回值就是对应在该数组中的索引,如果该查找值不在数组中,那么返回值是-((插入值)-1)
2024-09-21 19:43:33
417
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人