![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
文章平均质量分 76
YOU619
这个作者很懒,什么都没留下…
展开
-
算法通关村第六关—二叉树的层次遍历
我们可以看到这里就是从左到右一层一层的去遍历二叉树,先访问3,之后访问1的左右子孩子 9 和10,之后分别访问9 和20的左右子孩子 [4,5]和[6,7],最后得到结果[3,9,20,8,13,15,7]。再来,既然能拿到每一层的元素了,能否找到当前层最大的元素?为了满足题目要求的返回值为「先从左往右,再从右往左」交替输出的锯齿形,使用一个 flag 开关,默认为 false(第一层不需要转),在判断每层子节点的时候,如果 为 true 那么就先从右孩子开始入队(锯齿),每层遍历完 flag =!原创 2023-08-04 16:13:48 · 203 阅读 · 2 评论 -
算法通关村第六关—如何使用中序和后序来恢复一颗二叉树
深度为k的二叉树最多有2^{k}-1个结点(k>=1)原创 2023-07-31 22:55:00 · 112 阅读 · 0 评论 -
算法通关村第五关——队列练习
实现 MyStack 类: void push(int x) 将元素 x 压入栈顶。boolean empty() 如果栈是空的,返回 true;leetcode225 先看题意: 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。void push(int x) 将元素 x 推到队列的末尾。中时,又有新数据要插入,那么在下次的时候,会立马压入到。int peek() 返回队列开头的元素。的元素全部入栈,这时此栈就相当于队列了。原创 2023-07-30 21:48:16 · 83 阅读 · 1 评论 -
算法通关村第五关——理解队列
队列的特点是节点的排队次序和出队次序按入队时间先后确定,即先入队者先出队,后入队者后出队,即我们常说的FIFO(first in first out)先进先出。队列实现方式也有两种形式,基于数组和基于链表。对于基于链表,因为链表的长度是随时都可以变的,实现起来比较简单。如果是基于数组的,会有点麻烦,我们将其放在黄金挑战里再看,这里只看一下基于链表实现的方法。定义三个变量,front 和 read 保存队列头和队列尾的数据,分别是 Node 类型,size 用来记录队列长度。记录尾部,长度 size++原创 2023-07-30 21:39:16 · 122 阅读 · 1 评论 -
算法通关村第四关——栈的练习
首先看题目要求,LeetCode20. 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。原创 2023-07-30 21:35:17 · 52 阅读 · 1 评论 -
算法通关村第三关——双指针的妙用
LeetCode27.给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。要求:不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。使用对撞双指针,一个指针 left指向头,另一个 right指向尾部,如果 left发现目标值了,就与right交换,然后 right--,因为不知道换来的right。原创 2023-07-30 00:20:43 · 59 阅读 · 1 评论 -
算法通关村第四关——理解栈
栈和队列是比较特殊的线性表,又称之为访问受限的线性表。栈是很多表达式、符号等运算的基础,也是递归的底层实现。理论上递归能做的题目栈都可以,只是有些问题用栈会非常复杂。栈底层实现仍然是链表或者顺序表,栈与线性表的最大区别是数据的存取的操作被限制了,其插入和删除操作只允许在线性表的一端进行。一般而言,把允许操作的一端称为栈顶(Top),不可操作的一端称为栈底(Bottom),同时把插入元素的操作称为入栈(Push),删除元素的操作称为出栈(Pop)。若栈中没有任何元素,则称为空栈。原创 2023-07-30 00:45:52 · 58 阅读 · 1 评论 -
算法通关村第三关——不简单的数组增删改查
从两个数组的有值的末尾开始遍历,因为两个都是升序的数组,所以它们最大的值就是在尾部,一开始比较,哪个值大,就插入到 arr1数组的尾部,然后对应的下标 -1。的末尾了,i 已经 == -1了,这时候直接 将 arr2 的值填入 arr1中即可,也就是代码中 的 第一个判断语句。,一方为 true则就是递增或递减,如果两个值都是 flase ,那么就同时出现递增和递减的情况,返回 false。先找到要被增加的位置,然后从该位置起,后面的值依次往后移,然后新值插入到该位置。中,使合并后的数组同样按。原创 2023-07-25 15:46:48 · 64 阅读 · 0 评论 -
算法通关村第二关——链表白银挑战
请你反转从位置 left 到位置 right 的链表节点,返回反转后的链表。LeetCode24.给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。首先需要的是一个 cur 节点来保存需要交换节点的 前一个节点,每次循环后使 cur 后面的两个节点交换,然后 cur 在进行连接。(需要反转的第一个节点),然后找到最后一个需要反转的节点 rightNode。后面的节点(后面不需要反转的节点),然后再将。保存 pre.next。原创 2023-07-23 15:12:11 · 138 阅读 · 1 评论 -
算法通关村第二关——终于学会链表反转了
这次就与上次不同了,但是思想是差不多的,上次是借助虚拟节点 ans 实现的反转,可能会在面试时会被禁止使用,原因是不借助虚拟节点更难。最后在返回的时候,要返回 ans.next,因为 ans作为头节点的值是 -1,后面才是反转后的值。第三次: ans = -1 -> 1 -> 2 -> 3。第四次: ans = -1 -> 2 -> 3 -> 4。节点,让它作为链表的头部,每次循环遍历链表,ans。这里是直接操作原来的链表,返回的链表引用地址的一样的。第二次: ans = -1 -> 1 -> 2。原创 2023-07-21 15:58:41 · 171 阅读 · 1 评论 -
算法通关村第一关——链表经典问题之两个链表第一个公共子节点
剑指 Offer 52.这道题,而且涉及到几种解链表题目常用的方法。需要找到两个链表的 第一个公共节点比如那么这两个链表的 第一个公共节点就是5->9。原创 2023-07-19 15:46:05 · 310 阅读 · 0 评论 -
算法通关村第一关——链表青铜挑战笔记
遍历,从 2 开始,进行计数,循环遍历当前链表,如果该节点位置与要插入的位置相同,那么则直接跳出循环,在后面进行 节点交换(如果都写在 while 循环里,看起来太复杂了,到到这里反正是会遍历到这个 位置的,所以直接 break)链表是一种最基本的结构,普通的单链表就是只给你一个指向链表头的指针head,如果想访问其他元素,就只能从head开始一个个向后找,遍历链表最终会在访问尾结点之后如果继续访问,就会返回null。的指针已经指向了最后一个节点,然后将新节点添加为最后一个节点的下一个节点。原创 2023-07-17 23:54:28 · 587 阅读 · 2 评论