剑指offer和leetcode的刷题总结

链表

复杂链表的复制

需要注意的点就是
1有可能节点会没有random指针,因此需要排除那种情况在进行复制随机指针
2在两个链表拆分的时候,需要指定,有可能原链表temp走到了最后一个的情况,需要进行排除

在这里插入图片描述

删除链表中的重复节点

需要注意区分相等的情况和不相等的情况

在这里插入图片描述

二叉树的之字打印

借助双端队列来实现bfs,每一次先判断每一层有多少个元素,然后依次出队列加到链表中。
在这里插入图片描述

根据中序遍历和前序遍历数组,还原其树

注意Arrays.copyOfRange()的使用,是左闭右开的

在这里插入图片描述

比较树的子结构

这一点要注意一下先判断node2,在判断node1,如果node2为空,说明判断完成,里面含有子结构,但是如果node2不为null,但是node1为null了,就说明不含有子结构了,可以直接返回false了。

在这里插入图片描述

路径上的值是否为sum

简简单单的一个BFS,注意题目要求必须是从头节点到根节点,因此需要进判断还必须要是根节点。

在这里插入图片描述

路径2

看不太懂递归

在这里插入图片描述

把树转化成双向链表

想法就是先把中序遍历的结果输出,然后根据中序遍历的结果,创建新的树,注意左右树别反了。

在这里插入图片描述

判断是否为平衡树

这个递归是真的恶心啊。

在这里插入图片描述

判断镜像二叉树

在这里插入图片描述

在二叉树中找到两个节点的公共祖先

这一题还是比较复杂的,因为需要许多的数据结构来存储节点的值和其父节点,
当把两个子节点都加入到集合中时,说明找到子节点,然后将其中一个子节点往上找,一致找到根节点,然后判断另一个子节点的父节点中是否有相同的节点

在这里插入图片描述

二叉搜索树的最近公共节点

这个啊,利用上面的解法也可以解,但是另一种方法是利用二叉搜索树的特点来进行查找,二叉搜索树是排好序的,
如果两个 目标值都小于根节点,则说明公共节点肯定在左子树,
如果一个大于根节点,一个小于根节点,那么当前根节点就是公共父节点,
如果都大于根节点,则说明公共节点肯定在右边

在这里插入图片描述

栈结构

用两个栈实现队列的先进先出

在这里插入图片描述

用两个栈实现min函数,当调用时,显示栈中最小的元素

核心代码就在于另一个栈中始终记录下最小的值的时候,还需要进行弹栈出栈的操作。

在这里插入图片描述

确定栈的弹出和压入是否一致

在这里插入图片描述

滑动窗口的最大值

在这里插入图片描述

使用栈完成句子的 反转

在这里插入图片描述

二分法查找

在这里插入图片描述

旋转数组的最小值

在这里插入图片描述

给出一串从0开始的数,让你求第n位是什么数字

关键是先理解题目,第n位是什么,就是需要求出第n位的十进制数字,然后确定在这个十进制数字的中间,的某一位数字。

在这里插入图片描述

动态规划

青蛙跳台阶,斐波纳契数列和矩形覆盖问题

在这里插入图片描述

连续子数组的最大和

本题需要早最大长度的,因此需要记录下来最大长度

在这里插入图片描述

买股票的最大利润

在这里插入图片描述

买礼物的最大值

注意for循环中是dp数组的长度

在这里插入图片描述

把数字翻译成字符串

有两种情况,一种是把0翻译成a的。直接进行动态规划

在这里插入图片描述
另一种是把1翻译成a,0不能翻译,也就是10只能翻译成j,不可以拆分成1和0
在这里插入图片描述

排序算法

数组中的逆序对

使用归并排序,先分,后和,分的时候4个参数,和的时候5个参数

在这里插入图片描述

使用堆排序找最小的几个数或者最大的几个数

在这里插入图片描述

数据流中的中位数

在这里插入图片描述

位运算

不使用加法的加法

在这里插入图片描述

在这里插入图片描述

其他算法

字符流中第一个不重复的字符。

在这里插入图片描述

将数组分为前面是奇数,后面是偶数

版本1,不按照原来排列的顺序
在这里插入图片描述
版本2,要求需要按照原来的顺序

leetcode

链表中的数字相加
在这里插入图片描述

无重复最长字串

在这里插入图片描述

最长回文子串

从每一个字符开始往两边找,先找到重复的尽头,然后再比较最左端和最右端是否相等,然后在记录长度,得到长度和最左端的起始位置,然后substring截取。substring是左闭右开的。

在这里插入图片描述

盛水的最大值

在这里插入图片描述

三数之和

在这里插入图片描述

电话号码的组合

在这里插入图片描述

括号的生成

在这里插入图片描述

下一个稍微大一点的排列

在这里插入图片描述

在这里插入图片描述

搜索旋转数组查找目标值

整体思路就是转换成有序数组中的查找,既然是局部有序的,那么从middle拆分必定是有一个端是单调的。如果是单调的,先判断目标值是否在这个区间内,然后进行缩小范围,就从单调里面利用二分法找目标值。

在这里插入图片描述

数组总和之后等于目标值(可以重复的使用数组元素)

//别忘了先对其进行排序
在这里插入图片描述

接雨水

构造单调递减的队列

全排列

在这里插入图片描述

移动图像

情况一:顺时针转 90 度:先转置再左右镜像
1 2 3 — 7 4 1
4 5 6 — 8 5 2
7 8 9 — 9 6 3
情况二:顺时针转 180 度:先上下镜像,再左右镜像(先左右再上下也可)
1 2 3 — 9 8 7
4 5 6 — 6 5 4
7 8 9 — 3 2 1
情况三:顺时针转 270 度:先转置再上下镜像
1 2 3 — 3 6 9
4 5 6 — 2 5 8
7 8 9 — 1 4 7

在这里插入图片描述

字母异位词分组

在这里插入图片描述

跳跃游戏

在这里插入图片描述

合并区间

难点就在于如何写比较器,将数组中所有的行第一个数按照从小到大的排列
还有就是最后返回的时候,将结果变成一个二维数组返回。

在这里插入图片描述

颜色分类

在这里插入图片描述

最小覆盖子串

在这里插入图片描述

子集问题

在这里插入图片描述

矩形的最大面积

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_56184347/article/details/123679303