实在是觉得自己的算法水平太差了,在这里汇总,总结一下hot100的类型以及一些做题思路

哈希方法

都是使用unordered_set容器来实现o(1)的查找,两数之和是target-num, 字母异位词是sort之后查key,最长连续子序列是找到**!arr.count(n - 1)*,然后递增查找下一个记录最长。

双指针

关键在于理解两个指针的间距,以及控制两个指针的相对位置关系。移动0通过使间距等于0的数量,对fast与slow指针进行swap,使得最后n个数字为0最多水容器使用间距表达盛水,通过*height[left]>height[right]?right–:left++;*来找到最大值。三数之和则通过固定一个值来实现双指针求三数之和。

滑动窗口

主要通过对窗口边界的控制完成算法。例如无重复最长子串通过一个unordered_map<char,int> 实现对字母位置的记录,进而不断更新窗口。字符串中所有字母异位词则是通过滑动窗口加上字符计数来实现的。

子串

和为k的子数组使用类似前缀和的方式,通过mp.count(prefix-k)来计算等于target的子数组数量。

链表

求相交点时可以通过走两遍来找交点。反转链表则常用头插法。如果需要寻找链表中点则使用快慢指针,注意如果偶数个则找到第二个(也就是说总数为10个,快慢指针找到第6个)。另外还有链表中的排序,也就是归并排序,需要掌握.

二叉树

二叉树有三种遍历方式,前中后序,一般使用递归方式进行遍历。求深度(高度)要后序遍历(从底至上),求路径和要先序遍历(从上至底)。还有个求直径的题,很有趣,是首先对root->left和root->right分别求高度,然后在遍历过程中对每个节点都计算左右子树的高度,更新最大值。如果想要将一个升序数组转化为平衡二叉搜索树,那么以中点作为根节点,左侧为左子树,右侧为右子树,递归处理。同理的将一个二叉搜索树中序遍历也可以得到升序数组,以此判断是否是二叉搜索树。


本站由 Edison.Chen 创建。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。