leetcode算法题总结
1、面试题整理
1.1 入门
1)两数之和(1, easy)
考察对map的使用,通过空间换时间
2)有效的括号(20, easy)
考察对map的使用,需要会对containsKey灵活使用
3)二分查找(704,easy)
考察最基础的分治算法的理解
1.2 基础
1)两数相加(2, middle)
考察的比较基础,需要注意进位、取模的逻辑。特别是代码要精简,写出来的代码逻辑不能特别地乱,或者说重复。
2)岛屿数量(200,middle)
考察的是递归写法,以及对二维数组边界的判断。
递归写法比较简单,非递归写法比较考验基础。
1.3 适合1-3年面试
1)三数之和(15, middle)
考察对双指针的理解
2)无重复字符的最长子串(3, middle)
考察对滑动窗口的理解。
3)最长回文子串
容易想到的是中心扩散法,进一步优化可以使用动态规划。
最长回文子串最佳解法
4)四数之和(18, middle)
三数之和的升级版,还是考察队双指针的理解,同时也考察处理复杂业务代码的能力(业务逻辑比三数之和更复杂了)。
5)和为 K 的子数组(560,middle)
使用前缀和的方法,将问题转化为求解两个前缀和之差等于k的情况。
6)数组中的第K个最大元素(215,middle)
面试高频题,考察随机快排的应用。很典型的一道题。
7)最大子数组和(53,middle)
代码量很小,有点像智力题,抓住关键点(既然是连续序列且求最大和,判断下要不要取前面的子序列和就行了)就很容易做出来。
8)最长回文子序列(516,middle)
一道动态规划的典型题目,代码量不大,既考察智力又考察动态规划,非常适合作为面试题目。
9)编辑距离(72,middle)
考察分治思想和动态规划,代码量适中,非常适合作为面试题目。
10)二叉树的层序遍历(102,middle)
考察递归写法和非递归写法。
非递归写法用一个队列保存当前层的节点,遍历的时候注意提前记下当前层的节点个数,遍历的时候只处理当前层的节点,下一层的节点继续进入队列。
11)重排链表(143,middle)
考察智力或者平时的刷题能力。核心是先要找到链表中点,然后反转中点后的链表,最后将两段链表进行合并。
一道题里面集合了3个小方法(链表原地反转、寻找链表中点、链表合并),代码量适中,适合作为面试题。
12)搜索旋转排序数组(33,middle)
考察智力或者平时的刷题能力。核心点是明确二分查找后,总有一边是有序的,根据这个条件就可以比较清楚地完成这道题目。
13)零钱兑换(322,middle)
主要考察动态规划的基本功,用一维数组作为动态规划容器,递归保存最优结果。该题用回溯方法做会超时。
14)每日温度(middle)
考察队列的使用熟悉度,有场景的题目,代码量比较小,适合作为面试题。
15)最长重复子数组(middle)
考察二维动态规划,代码量比较小,适合作为面试题。
16)分发糖果(hard)
贪心算法、线性遍历,有场景的题目,考察平时刷题能力。代码量比较小,适合作为面试题。
17)打家劫舍(middle)
典型的一维动态规划题目,有场景的题目,代码量也比较小,适合作为面试题。
18)最长连续序列(middle)
考察平时的刷题能力/算法能力,使用hashSet+判断是否可以是起始元素来实现O(n)的时间复杂度。代码量比较小,适合作为面试题。
1.4 适合3年以上面试
1)最长递增子序列(300, middle)
2)LRU 缓存
考察缓存的基本功、以及hashmap与双向链表数据结构整合的理解。
LRU缓存解法
3)正则表达式匹配(hard)
动态规划、逻辑挺绕的。能做出来,说明刷题基础很扎实。
4)滑动窗口最大值(hard)
考察是否会用单调队列来解决如何在O(n)时间内记录窗口内最大值的问题。
5)二叉树中的最大路径和
考察观察和平时刷题能力,根节点只能取父节点、左子树、右子树,3个节点中最多2个节点求和。
6)N 皇后(hard)
考察回溯的基本功,同时也考察解决实际问题的能力,需要用3个集合来保存已放过的列、左上右下斜对角线、右上左下斜对角线。
7)分割等和子集
考察0-1背包问题、动态规划的处理,需要对问题进行转化。需要对二维动态规划的处理比较熟悉。