- 博客(22)
- 收藏
- 关注
原创 算法通关村——队列基本问题解析
队列(Queue)是一种特定的数据结构,它遵循先进先出 (FIFO) 的原则。这意味着元素从队列的一端(通常称为“队尾”)添加,并从另一端(通常称为“队首”)队列实现方式有两种形式,基于数组和基于链表,因为链表长度随时可以变化,实现起来比较简单,只要在尾部后插入元素,在头结点删除元素即可。
2023-09-11 15:49:54 148
原创 算法通关村——Hash基础问题解析
将哈希表的每个单元作为链表的头结点,所有的哈希地址为i的元素构成一个同义词链表,发生哈希冲突时就把关键字链在该单元为头结点的链表的尾部。开放定址法的核心思想是,如果目标位置(哈希值指示的位置)已被占用,就在哈希表内部寻找另一个可用的位置来存储这个键和它的关联数据。通常,不同的输入值被转换为不同的输出值,但实际输出值的数量有限,可能会出现不同的输入值被转换为同一个输出值的情况。哈希(Hash)称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。
2023-09-11 15:41:51 120
原创 算法通关村——括号匹配问题解析
细节:1)如果有两个右括号连续出现的时候,在我们遍历时对第一个右括号就已经与最近的左括号比较(且已经pop),不会干扰下一个右括号的判断。判断两个括号是不是一组的,可以用哈希表将所有符号先存储,左半边做key,右半边做value。在遍历字符串时,遇到左括号就入栈,遇到右半边就与栈顶符号进行比较,不匹配就返回false。2)最后已经遍历完毕,如果为空栈说明左括号已经一一匹配完毕,否则则剩下一些左括号在栈中。
2023-09-09 16:06:03 64
原创 算法通关村——如何基于数组(链表)实现栈
栈底层实现仍然是链表或者顺序表(数组),不过限制其插入和删除操作只能在线性表的一端进行。但是数组是固定大小的,所以每次入栈前要判断栈的容量是否够用,不够用可以进行扩容。可操作的一端称为栈顶(Top),不能操作的一端称为栈底(Bottom)(由于在头结点操作,不需要遍历整条链表就能找到相应的位置,时间效率高)栈和队列是特殊的线性表(访问受限====>后进先出)栈是很多表达式、符号等运算的基础,也是递归的底层实现。peek():显示栈顶元素,但是不出栈。empty():判断栈是否为空。pop():弹出元素E。
2023-09-08 21:26:35 50 1
原创 算法通关村——不简单的数组增删改查
4.1当循环结束时,`ans` 将包含 `target` 在数组中的位置,或者如果 `target` 不在数组中,它将包含 `target` 应该插入的位置。3.3然后,我们更新 `right` 为 `mid - 1`,因为我们知道 `target` 不可能在 `mid` 的右侧。3.2我们更新 `ans` 为 `mid`,因为这可能是 `target` 的位置或 `target` 应该插入的位置。3.4否则,`target` 大于 `nums[mid]`,这意味着 `target` 应该在数组的右半段。
2023-09-04 12:26:48 167
原创 K个一组反转
/pre为每次反转区间的前驱结点,反转完的start已经到了区间的最后。2) 对链表直接遍历,需要找到四个关键位置,用变量pre、start、end和next。1)要进行分组反转,分组处理即可,可以分成三部分(已经反转、正在反转和未反转)3)与穿针引线方法类似需要几个结点确定反转位置,再通过头插法进行插入即可。2)需要提前先将链表进行遍历得到具体长度,确定分成几组n=len/k。(区间反转方法简单略) 要将反转完的链表接入到原链表中去。1)还是将链表分成已经反转、正在反转和未反转三部分。
2023-09-03 18:02:02 33
原创 算法通关村第二关——链表加法问题解析
先把题目给出的链表遍历放入栈中,然后再依次从栈中弹出最后一位digit进行相加,再考虑是否需要进位(注意插入的时候需要使用头插法)注意事项: carry 如果在sum>=10的时候需要改为carry = sum/10;sum>=10时需要sum/10 来存入新的结点中去。然后可以使用头插法得到结果链表,也可以使用尾插(最后计算完毕后再反转)与栈的实现类似,通过将需要计算的两个链表反转便于得到最后一个元素。链表是从前往后,而计算加法是从最后一位开始。deque(双向队列)的实现基本与栈类似。
2023-09-03 16:28:34 69
原创 算法通关村第二关——两两交换链表中的结点问题解析
所以需要pre辅助指针来指向需要调整结点的前驱结点。细节处理:需要cur和next两个结点来存储需要更改的两个结点。确保在重新连接当前结点后仍然可以访问后续结点。2)因为要两两交换,画图可以发现交换后cur其实是后移,next前移。1)凡是看见可能要调整头结点的题,创建个虚拟头结点方便做题。3)交换完后令pre= cur完成前移。Leetcode24题。
2023-09-03 12:49:39 79
原创 算法通关村第二关——指定区间反转问题解析
通过一个cur遍历链表反转区间,头插法即将cur后的每一个结点插入到pre后(即反转区间的前一个结点后)所以可以把要反转的区间单独拿出来进行反转(简单的整条链表反转),再给他接回去。3)反转前需要将右节点rightNode.next = null这样断开连接。由于反转后左节点其实是变成右节点,而右节点其实变成了左节点。2)穿针引线首先要确定反转区间(即确定左结点和右节点)1)面对这种反转,通常采用虚拟头结点的方式比较简单。4)反转后要将反转完成的链表接回到原来的链表中。leetcode92题。
2023-09-02 11:13:24 38 1
原创 算法通关村第一关——链表经典问题之删除链表元素
我们要删除结点通常要找到该删除结点的前驱结点,所以要加入一个虚拟头结点便于我们从头遍历整条链表,找到目标结点只需要使用cur.next = cur.next.next来略过该结点。如果当前cur和cur.next对应的值相同,就移除cur.next,然后对移除后cur.next进行重复的操作,直到出现不同说明该元素已删除完毕,进入下一个不同的值判断。思路分析:需要记录一下当前重复的值(便于后续删除时剩下一个结点时仍能进行比较),如果存在相同的值需要继续内循环删除。
2023-08-30 16:26:35 101 1
原创 算法通关村第一关——链表经典问题之双指针专题
其实就是通过fast指针先走到第k+1结点,令fast指针与slow指针始终保持距离差,当fast走到链表尾部空结点时,slow指针走到链表的倒数第k个节点。这道题也是可以通过双指针找到倒数K的位置,然后将链表分成{1,2,3}和{4,5}两个序列,然后在进行拼接,具体实现思路。当slow一次走一步,fast一次走两步,当fast到达链表的末尾时,slow一定位于中间。LeetCode876 经典的快慢指针问题,用两个指针slow和fast遍历链表。注意事项,链表的长度可能小于k。
2023-08-30 11:29:27 52 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人