力扣刷题复盘-3

No.206

在这里插入图片描述

复盘:
1、这道题核心思路是遍历链表时原地将结点倒序
2、我用的是双指针,首先是创建了一个虚拟头节点,然后将后续结点逐个倒插至虚拟头节点和实际头结点之间,跟迭代思路类似。
3、题解是链表常见的两种操作方式:迭代和递归。
4、题解中的迭代是遍历一次,直接将每两个结点之间的指针反向指,这个复杂度和我的解法相同,但是更简洁一点。
5、这一题的递归稍微有点难理解,通过遍历链表进行递归,先记录下原序的后续结点,然后将两个结点调换顺序。

No.83

在这里插入图片描述

复盘:
1、这道题挺简单的,因为原本就是有序的链表,因此只需要遍历一次就可以完成了。
2、值得改进的地方就是只需要声明一个指针c就足够了,通过多次利用->next就可以得到后续结点地址。

No.20

在这里插入图片描述

复盘:
1、这是一道基本的栈相关的题目,需要学会基本的栈的使用,常见的栈的函数有:
s.empty(); //如果栈为空则返回true, 否则返回false;
s.size(); //返回栈中元素的个数
s.top(); //返回栈顶元素, 但不删除该元素
s.pop(); //弹出栈顶元素, 但不返回其值
s.push(); //将元素压入栈顶
2、核心思路就是将字符压入栈,然后将读取到的右括号字符与栈顶字符进行匹配,如果匹配则弹出栈顶字符,如果不匹配就是错的。
3、这道题难度不大,但是题解中的几个地方值得学习:
(1)使用哈希表的键值对来存储左右括号,然后再使用 count() 函数进行查找
(2)遍历字符串可以用for (char ch: s)
(3)如果字符总数为奇数则可以直接返回false,相当于预处理省去了对奇数个字符的字符串的判定过程

No.232

在这里插入图片描述

复盘:
1、这道题是经典的队列数据结构题,核心思路是用一个栈存储输入,用一个栈存储输出,
将一个栈中的数倒到另一个栈中的过程就把顺序调整了一遍,实现了先进先出
2、我第一次提交的时候出错了,最刚开始的尝试是每一次pop都把输入栈的元素push到输出栈中,
这样如果输出栈原本有元素的话顺序就会出问题,所以要加上判定条件,只有输出栈为空的时候才执行上述操作。

No.144

No.94

No.145

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

复盘:
1、这是经典的树的三种遍历方式,三道题的解法都是一样的
2、核心思路就是记清楚三种遍历的具体遍历顺序:
先序:根——左——右
中序:左——根——右
后序:左——右——根
3、三个题我都是用递归写的,递归的话简单易懂,只需要根据遍历顺序来返回不同的值就ok,一直遍历到空节点:
根:res.push_back(root->val);
左:inorder(root->left, res);
右:inorder(root->right, res);
4、题解中还提供了另外两个思路:
(1)第一个是迭代,通过迭代的方式把方法一的递归时的栈给模拟出来,和递归是等效的。
(2)第二个是Morris 遍历。理解起来比起前两种要困难一点,这里就把题解的先序遍历的规则放在这里:
Morris 遍历的核心思想是利用树的大量空闲指针,实现空间开销的极限缩减。其前序遍历规则总结如下:
1、新建临时节点,令该节点为 root;
2、如果当前节点的左子节点为空,将当前节点加入答案,并遍历当前节点的右子节点;
3、如果当前节点的左子节点不为空,在当前节点的左子树中找到当前节点在中序遍历下的前驱节点:
3.1:如果前驱节点的右子节点为空,将前驱节点的右子节点设置为当前节点。然后将当前节点加入答案,并将当前节点更新为当前节点的左子节点。
3.2:如果前驱节点的右子节点为当前节点,将它的右子节点重新设为空。当前节点更新为当前节点的右子节点。
4、重复步骤 2 和步骤 3,直到遍历结束。

No.102

在这里插入图片描述

复盘:
1、这道题是经典的BFS例题,通过BFS达到逐层遍历树的目的
2、核心思路就是用队列来存储每一行的数字:
(1)首先将根节点压入队列
(2)然后把根节点的左结点和右结点压入队列,再把根节点的值记录下来,再弹出队列
(3)后面就重复以上操作,把队列的头结点的左右结点压入队列,再把头结点弹出
(4)一直执行到队列为空,遍历就结束了

No.104

在这里插入图片描述
复盘:
1、这道题则是DFS的经典例题,通过DFS遍历树,可以得到最大深度
2、DFS的核心思路是递归,对于一个结点而言,我们只需要得到它的子节点的深度就行
通过这个思路进行遍历,当遍历到没有子节点的结点时则返回。

No.101

在这里插入图片描述
复盘:
1、这道题也是遍历树,但是是通过两种不同的遍历方式来判定树是否是对称的
2、核心思路就是通过两个指针来遍历树,两个指针的操作是相反的,第一个朝左,另一个就朝右,第一个朝右,另一个就朝左
如果两个指针能够同时遍历完且每个结点的值都相同,则说明树是对称的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值