- 博客(9)
- 收藏
- 关注
原创 算法通关村——Hash和队列的特征笔记
ThreadLocal有一个专门存储元素的TheadLocalMap,每次在get和set元素的时候,会先将目标位置前后的空间搜索一下,将标记为null的位置回收掉,这样大部分不用的位置就收回来了。例如上面要继续存7,8,9的时候,7没问题,可以直接存到索引为0的位置,8本来应该存到索引为1的位置,但是已经满了,所以继续向后找,索引3的位置是空的,所以8存到3位置。哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换为固定长度的输出,这个输出值就是散列值。接下来,我们看看如何取。
2023-10-11 11:42:42 161 1
原创 算法通关村——最大栈问题解析笔记
例如,如果当前第一个栈中的元素为[2,1,5,3,9],那么第二个栈中的元素为[2,2,5,5,9]。在push(x)操作时,只需要将第二个栈的栈顶和xx的最大值入栈,而在pop()操作时,只需要将第二个栈进行出栈。对于popMax(),由于我们知道当前栈中最大的元素值,因此可以直接将两个栈同时出栈,并存储第一个栈出栈的所有值。当某个时刻,第一个栈的出栈元素等于当前栈中最大的元素值时,就找到了最大的元素。因此我们将之前出第一个栈的所有元素重新入栈,并同步更新第二个栈,就完成了popMax()操作。
2023-10-09 16:59:09 219 1
原创 算法通关村——如何基于数组实现栈笔记
栈底层实现仍然是链表或者顺序表,栈与线性表的最大区别是数据的存取的操作被限制了,其插入和删除操作只允许在线性表的一端进行。一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。再看具体内容之前,先补充一点,top有的地方指向栈顶元素,有的地方指向栈顶再往上的一个空单位,这个根据题目要求设计就好,如果是面试的时候直接问面试官,top指向哪里,本文采用指向栈顶空位置。这个题是什么意思呢?
2023-10-09 10:44:22 151 1
原创 算法通关村第二关——删除元素专题笔记
当nums[left]等于val的时候,我们就将nums[right]位置的元素覆盖nums[left],继续循环,如果nums[left]等于val就继续覆盖,否则才让left++,也就是双指针的方法。LeetCode27.给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。元素的顺序可以改变,你不需要考虑数据中超出新长度后面的元素。LeetCode26 给你一个有序数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。
2023-09-25 15:48:36 148 1
原创 算法通关村第三关——数组增删改查笔记
0,0},原来8的位置,仍然是8,也就是删除4之后的结构为{1,2,3,5,6,7,8,8,0,0},此时表示元素数量的size会减1变成7,原来的8的位置仍然是8,因为我们是通过size来标记元素数量的,所以最后一个8不会被访问到。数组的初始化的本质就是覆盖已有的值,用你需要的值覆盖原来的0,因为数组本来是{0,0,0,0,0,0,0,0,0,0},这里只不过被你替换成了{1,2,3,4,5,0,0,0,0,0}。其次,数组中的元素在内存中的连续存储的,且每个元素占用相同大小的内存。
2023-09-21 11:38:51 173
原创 算法通关村第二关——指定区间问题解析笔记
请你反转从位置left到位置right的链表节点,返回反转后的链表。这个过程就是前面的带虚拟结点的插入操作,每走一步都要考虑各个指针怎么指,既要将结点摘下来接到对应的位置上,还要保证后续结点能够找到。这里注意的是,链表什么时候切断,什么时候补上,先后顺序一定要想清楚,如果想不清楚,可以在纸上模拟,思路清晰。反转的整体思想是,在需要反转的区间里,每遍历到一个结点,让这个新节点来到反转部分的起始位置。第二步:把pre的next指针指向反转以后的链表头结点,把反转以后的链表的尾结点的next指针指向succ。
2023-09-21 11:04:35 64
原创 算法通关村第二关——链表反转笔记
如图所示,如果我们将链表{1,2,3,4,5}进行反转,我们首先建立虚拟结点ans,并令ans.next=node(1),接下来我们每次从旧的链表上拆下来一个结点接到ans后面,然后将其他线调整好久可以了。我们再看一下执行期间的过程示意图,在图中,cur本来指向旧链表的首结点,pre表示已经调整好的新链表的表头,next是下一个要调整的。注意图中箭头方向,cur和pre是两个表头,移动过程中cur经过一次中间状态之后,又重新变成了两个链表的表头。(将上图代码理解并背诵!很重要很重要很重要!
2023-09-21 10:59:13 182
原创 算法通关村第一关——链表经典问题之双指针专题笔记
我们先将fast向后遍历k位,slow仍然指向链表的第一个结点,之后两个指针同步向后走,当fast走到链表的尾部空结点时,slow指针刚好指向链表的倒数第k个结点。当链表为偶数时,可返回示例2中的3或者4都可以,图上代码返回的是4,如果想返回3,加一个fast.next.next==null时返回solw的判断就可以了。(3)快指针走到链表尾部时,慢指针所在位置刚好是要断开的地方,把快指针指向的结点连到原链表头部,慢指针指向的结点断开与一下结点的联系。(4)返回结束时慢指针指向结点的下一结点。
2023-09-07 16:10:46 315 1
原创 算法通关村第一关——链表青铜挑战笔记
在中间位置插入,我们必须先遍历找到要插入的位置,然后将当前位置接入到前驱节点和后继节点之间,但是到了该位置之后我们却不能获得前驱节点了,也就无法将节点接入进来,因此,我们要在目标节点的前一个位置停下来,然后用cur.next的值而不是cur的值来判断,这是链表最常用的策略。在头部插入节点即新节点为头部节点,首先要找到链表的head头部节点,新节点后继只想head的节点,head更新为新节点为头部节点,然后往下遍历输出链表。如链表为空则直接插入节点为头部节点。我们只要将尾部节点指向新节点就可以了。
2023-09-07 09:48:09 316 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人