链表
复杂链表的复制
需要注意的点就是
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
字母异位词分组
跳跃游戏
合并区间
难点就在于如何写比较器,将数组中所有的行第一个数按照从小到大的排列
还有就是最后返回的时候,将结果变成一个二维数组返回。