自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 《算法通关村—迭代实现二叉树的前序遍历》

前序遍历是中左右,如果还有左子树就一直向下找。从根节点开始,边遍历,边添加到集合中,然后继续找它的左节点。直到左节点为空,就将它出栈然后找它的右节点。递归就是每次执行方法调用都会先把当前的局部变量、参数值和返回地址等压入栈中,后面在递归返回的时候,从栈顶弹出上一层的各项参数继续执行,这就是递归为什么可以自动返回并执行上一层方法的原因。这个问题,首先我们可能是先想到递归法,理解起来也比较容易。如果不让我们使用递归呢,那就不得不介绍下第二种方法:迭代法。理论上,递归能做的迭代一定能做,但可能会比较复杂。

2023-08-23 10:43:05 63

原创 《算法通关村—原来如此简单》二叉树的层序遍历

我们可以使用一个变量size标记一下,size表示某一层的元素个数,只要出队,就将size减1,减到0就说明该层元素访问完了。我们可以使用一个队列 ,先将根节点root放进队列中,然后将根节点出队的同时,将它的左右节点入队。后面的节点操作也是如此,将该节点出队的之后,入队它的左右节点。每次for循环中,我们执行的都是将该节点出队,然后入队其左右节点。再来,我们将9,20出队,队列长度-2变为0,但是又入队了它们的左右节点,长度+4。如:将3出队,队列长度变为0,然后入队它的左右节点,队列长度又变为2。

2023-08-19 21:54:55 59

原创 《算法通关村—如何使用中序和后序来恢复一颗二叉树》详细图解

假设我们现在知道一颗二叉树的中序遍历和后序遍历的结果,要怎么恢复这颗二叉树呢?

2023-08-19 10:40:14 60

原创 《算法通关村—LRU的设计与实现》

上述各项操作中,访问哈希表的时间复杂度为 O(1),在双向链表的头部添加节点、在双向链表的尾部删除节点的复杂度也为 O(1)。value是我们自己封装的node,key则是键值,也就是在Hash的地址。这样一来,我们要确认元素的位置直接访问哈希表就行了,找出缓存项在双向链表中的位置,随后将其移动到双向链表的头部,即可在 O(1)的时间内完成 get 或者 put 操作。○如果 key 存在,则与 get 操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。

2023-08-17 15:42:08 67 1

原创 《算法通关村—用队列实现栈》

由于每次入栈操作都确保queue1的前端元素为栈顶元素,因此出栈操作和获得栈顶元素操作都可以简单实现。出栈操作只需要移除queue1的前端元素并返回即可,获得栈顶元素操作只需要获得 queue 1的前端元素并返回即可(不移除元素)。并且因为 queue 1用于存储栈内的元素,判断栈是否为空时,只需要判断 queue1是否为空即可。否则,返回 false。学完栈和队列的基础知识后,我们可以通过做算法题,来巩固知识,同时检验自己。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。

2023-08-16 21:45:46 35 1

原创 《算法通关村—队列的实现》

队列的特点是节点的排队次序和出队次序按入队时间先后确定,即先入队者先出队,后入队者后出队,即我们常说的FIFO(first in first out)先进先出。就像我们平常吃饭的时候去食堂排队打饭,去的早,先进队伍,我们就先打到饭,先出队列是一个道理。队列实现方式也有两种形式,基于数组和基于链表。对于基于链表,因为链表的长度是随时都可以变的,实现起来比较简单。如果是基于数组的,则复杂一些。这里我们采用链表来实现队列。基于链表实现队列还是比较好处理的,只要在尾部后插入元素,在头部删除元素就行了。

2023-08-16 21:05:36 30 1

原创 《算法通关村—“计算器问题“问题解析》

具体来说,遍历字符串 s,并用变量preSign 记录每个数字之前的运算符,对于第一个数字,其之前的运算符视为加号。代码实现中,若读到一个运算符,或者遍历到字符串的末尾,即认为是遍历到了数字末尾。由于乘除优先于加减计算,因此我们要考虑先进行所有乘除运算,并将这些乘除运算后的整数值放回原表达式的相应位置,随后整个表达式的值,就等于一系列整数加减后的值。基于此,我们可以用一个栈,保存这些(进行乘除运算后的)整数的值。对于乘除号后的数字,可以直接与栈顶元素计算,并替换栈顶元素为计算后的结果。

2023-08-12 16:15:16 43 1

原创 《算法通关村—最小栈问题解析》

最小栈来自LeetCode155设计一个支持pushpoptop操作,并能在常数时间内检索到最小元素的栈。实现MinStackMinStack()void pop()int top()

2023-08-12 10:28:51 40 1

原创 《算法通关村—如何实现栈》

栈是一种比较特殊的线性表,又称之为访问受限的线性表。栈是很多表达式、符号等运算的基础,也是递归的底层实现。理论上递归能做的题目栈都可以,只是有些问题用栈会非常复杂。栈底层实现仍然是链表或者顺序表,栈与线性表的最大区别是数据的存取的操作被限制了,其插入和删除操作只允许在线性表的一端进行 (我们也称为,后进先出 / 先进后出)。一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。

2023-08-11 11:06:10 65 1

原创 《算法通关村第三关--黄金挑战》数组之“荷兰国旗问题“

index位置上的数字代表着我们当前需要处理的数字。当index为数字1的时候,我们什么都不需要做,直接+1即可。如果是0,我们放到左边,如果是2,放到右边。如果index=right,则可以停止。●index指针,从头到尾遍历数组,根据nums[index]是0还是2决定与left交换还是与right交换。上面的方式能解决问题,而且效率还不错。但是,如果我们想要一次遍历就完成,行不行呢?●right指针 ,表示right右侧的元素都是2。●left指针,表示left左侧的元素都是0。

2023-08-08 22:18:00 41

原创 《算法通关村第三关--双指针的妙用》删除数组的元素专题

图示:代码://fast充当了快指针的角色fast++) {= val) {slow++;//最后剩余元素的数量方法二:对撞指针核心思想:定义两个指针,left=0在数组的开头,right=nums.length-1在数组末尾。left指针的位置不是val就继续前进left++,遇到val就停下相反,当right指针的位置是val就后退right--,遇到不是val的就停下。当nums[left]==val和nums[fast]!=val时 ,我们就交换两个指针位置的值。

2023-08-04 16:15:36 38 1

原创 《算法通关村第三关--不简单的数组增删查改》

2.数组存储元素的特征1.数组空间不一定是满的,比如:我创建一个长度为10的数组,可能只用了4个空间。注意数组中数据的实际个数size=4和数组长度length=10可能不一样。2.不同语言初始化数组的方式不同,在java中int类型的数组默认初始化为0。3.数组的创建和初始化// 方法括号跟数组名,谁写在前面,谁写在后面都是一样的。//静态初始化//简化格式4.对数组的增删查改。

2023-08-02 21:46:28 40 1

原创 《算法通关村第二关-黄金挑战》k个一组的链表反转

/链表长度while (cur!//链表分组cur = head;i < n;i++) { //要反转几组j < k - 1;j++) { //每组反转几次pre = cur;//为下一组反转作准备。

2023-08-01 15:37:55 73 1

原创 《算法通关村第二关-单链表之指定区间反转问题》

在前一种方法的基础上进行改变,我们 获取指定链表区间的头节点定义为leftNode,以及最后一个节点rightNode。将链表进行拆分,指定的链表区间全部反转完成后,再接回来即可。

2023-07-29 16:20:05 76 1

原创 《算法通关村第二关-终于学会了链表反转》

1.我们需要定义一个空节点pre=null(pre就相当于新链表的头节点),一个当前节点cur=head;4.开始的时候,我们先获取cur的下一个节点定义为next。这样以pre为头节点的链表就有了第一个元素,重复此过程直到旧链表全部加到新的链表中。1.我们先建立一个虚拟节点ans,它的初始值设为空,next为null。5.之后重复执行此过程,新节点放在ans的后面,在其它节点的前面。3.令cur.next=pre ,pre=cur。4.最后让cur移动到下一个节点cur=next;

2023-07-28 10:47:35 48 1

原创 《算法通关村第一关-黄金挑战笔记》单链表的环问题,及双链表单基本操作

/节点的数值//记录上一个节点的位置//记录下一个节点的位置//双链表的头节点//尾节点//双链表的长度throw new IndexOutOfBoundsException("索引超出数组范围");//创建要插入的节点if(size==0) {//链表为空else if(index==0) {//头部插入else if(index==size) {//尾部插入}else {//中间插入//获取插入位置的上一个节点size++;

2023-07-27 20:48:54 25 1

原创 《算法通关村第一关-链表经典问题之:两个链表的第一个公共子节点》

可以参考这张图,理解一下由于新建立链表太浪费空间了,我们可以优化一下。只要每次遍历完一个链表之后,调整一下指针到下一个链表的表头就行了。比如:我们访问完了A之后将指针指向B的表头,再将B遍历完,不就相当于是遍历完了AB。//如果两个单链表中的一个或全部为空,则不可能存在公共节点,直接返回null= temp2) {

2023-07-25 16:26:13 35 1

原创 《算法通关村第一关-链表青铜挑战笔记》单链表的实现及其,增加,删除操作。

图中第2,3步 不能颠覆 (要是先执行第3步即 先让preNode的next指向newNode,那么从头节点开始就只能找到newNode了 ,insertNode开始的后面的节点将会从链表中脱离)单向链表的每一个节点又包含两部分,一部分是该节点的数据变量data,另一部分是指向下一节点的指针next.假设要删除的节点为removeNode,我们先找到removeNode的上一个节点命名为preNode。链表的第一个节点被称为头节点,最后一个被称为尾节点,尾节点的next指针指向空。

2023-07-19 23:45:43 77 1

空空如也

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

TA关注的人

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