Skip to main content
  1. Software/

Leetcode Hot100

哈希表
#

两数之和
#

任务:查找出数组中和为目标的两个数的下标

做法:建立字典,存储每个数字和下标,然后遍历进行O(1)查找既可

字母异位词分组
#

任务:将字母组成相同的单词归类

做法:遍历,按字母组成存储为键,可以用排序/统计个数来获得键

最长连续序列
#

任务:找到数组中最长的连续数字序列,要求o(N)

做法:首先将数组转为集合,以实现O(1)查找;然后,对于每一个数,迭代地寻找它的下一个数,直至下一个数不存在,即为序列长度;为了减小复杂度,只需要查找序列首位的数字,即上一个数不存在的数字;最后,找到序列长度的最大值既可。

双指针
#

移动零
#

任务:给定一个数字,将所有的零都移动到末尾,要求就地操作。

做法:移动非零数,双指针,一个指针搬运非零数,另一个指针扫描非零数,非零数扫描完后,接着填充0。

最大储水面积
#

任务:给定数组描述挡板高度,计算左右挡板的储水面积

做法:从两端开始移动指针,若面积增大则更新最大值,直至指针交汇;由于移动长边面积只会减小,所以只需要移动短边,并确保增大既可。

三数之和
#

任务:给定数组,返回所有和为0的三数,要求不能重复

做法:首先为了避免重复,先对数组排序,O(NlogN);其次,定下第一个数后,用双指针来确定剩下两个数的位置,因为是升序,所以可以根据两数之和来定向地操控其中一个指针。(注意三个数在迭代地时候都需要不断地跳过相同的数,以达到去重;首个数字需要<=0,否则直接退出)

接雨水
#

任务:给定表示高度的数组,计算可以接的雨水

做法: (动态规划)计算出每个柱子左右柱子的最大值的最小值。从左往右,O(N)得到每个柱子左边的最大值,从右往左得遍历,得到每个柱子右边的最大值,然后再求每个位置的最小值即可。(单调栈)雨水只会在低洼处累积,用单调栈记录递减值,若递减则入栈,若递增,则计算Min(Left,i),得到Top处的雨水量,然后将Top出栈(双指针)同时计算两根柱子左右柱子的最大值的最小值,相比动态规划,空间复杂度更低,无需额外的数组来存储左右柱子最大值

二叉树
#

中序遍历
#

任务:沿着左-中-右顺序遍历所有节点

做法:递归,对于根节点,返回其左节点的中序遍历、该节点的值、右节点的中序遍历。(特殊情况:若为空节点,则返回空列表)

最大深度
#

任务:求最大深度

做法:递归,返回左节点和右节点的最大深度的最大值+1

翻转二叉树
#

做法:递归,左右节点互换的同时,将其子树的左右节点也互换

对称二叉树
#

做法:递归地判断左右两颗子树是否是镜像(条件:值相等+交叉镜像)

二叉树的直径
#

任务:求二叉树两节点间的最大距离

做法:递归地求解每个节点的高度,同时在递归调用的函数内求解途径该节点的路径的最大值(左高度+右高度)

高度:到叶节点的距离(叶节点的高度为1)

深度:到根节点的距离(根节点的深度为1)

二叉树的层序遍历
#

任务:从上到下一层一层访问,返回列表的列表,每个列表是一层的节点值

做法:构造队列,根节点出队的同时,将左右节点入队,并将值加入列表(可以用list实现)

动态规划
#

爬楼梯
#