leetcode算法题总结

1 入门

1)两数之和(1, easy)
考察对map的使用,通过空间换时间

2)有效的括号(20, easy)
考察对map的使用,需要会对containsKey灵活使用

3)二分查找(704,easy)
考察最基础的分治算法的理解

2 基础

1)两数相加(2, middle)
考察的比较基础,需要注意进位、取模的逻辑。特别是代码要精简,写出来的代码逻辑不能特别地乱,或者说重复。

2)岛屿数量(200,middle)
考察的是递归写法,以及对二维数组边界的判断。
递归写法比较简单,非递归写法比较考验基础。

3 适合1-3年面试

1)三数之和(15, middle)
考察对双指针的理解

2)无重复字符的最长子串(3, middle)
考察对滑动窗口的理解。

3)最长回文子串
容易想到的是中心扩散法,进一步优化可以使用动态规划。
最长回文子串最佳解法

4)四数之和(18, middle)
三数之和的升级版,还是考察队双指针的理解,同时也考察处理复杂业务代码的能力(业务逻辑比三数之和更复杂了)。

5)和为 K 的子数组(560,middle)
代码量适中,适合作为面试题。考察刷题能力。使用前缀和的方法,将问题转化为求解两个前缀和之差等于k的情况。

6)数组中的第K个最大元素(215,middle)
代码量适中,适合作为面试题。对快速排序的典型应用,特别地,由于特殊case存在大量重复的数字,因此不能只让某一边的下标一直移动,要让两边的下标同时往里面移动。另外也考察对堆排序的基础。两者都可以考察,比较有难度,非常适合作为面试题。难度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)的时间复杂度,hashSet可以O(1)时间查是否存在该值,逻辑判断该值-1是否存在,不存在说明是连续序列的第一个值。难度middle。
19)和为k的子数组
代码量适中,适合作为面试题。一道典型的动态累和的题目。O(n2)的做法是遍历的同时由后往前取累和判断是否满足条件,这个逻辑不是很好理解。O(n)的做法是通过前缀和+哈希表进行优化,问题转换为计算每一个位置i时的前缀和为sum[i]-k的个数,这个逻辑比较好理解。难度middle。
20)K个一组翻转链表
代码量偏多,可以作为面试题。主要考察代码设计能力。核心是确定好pre节点,cur节点后,再使用tail节点理清每一步的代码逻辑。难度middle+。
21)盛最多水的容器(middle)
代码量适中,适合作为面试题。考察刷题能力。使用双指针,每次移动板更短的那一边,一次遍历即可完成。
22)最长有效括号(hard)
代码量适中,适合作为面试题。考察刷题能力。建一个栈,始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」。对于遇到的每个右括号,先弹出栈顶元素表示匹配了当前右括号,这个技巧非常重要。如果栈为空,放入栈中做更新;如果栈不为空,当前右括号的下标减去栈顶元素即为「以该右括号为结尾的最长有效括号的长度」。

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背包问题、动态规划的处理,需要对问题进行转化。需要对二维动态规划的处理比较熟悉。

5 典型题目

5.1 滑动窗口

外层循环遍历指针A,遍历时如果不满足条件则持续移动指针B,满足条件时停止并更新结果。开始下一轮遍历。
在这里插入图片描述

case1:最小覆盖子串
遍历右指针,当满足条件时,更新答案并持续移动左指针。开始下一轮遍历。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

case2:无重复字符的最长子串
遍历左指针,遍历时如果右指针不在滑动窗口内则持续向右移动,满足条件时停止更新结果。开始下一轮遍历。
在这里插入图片描述
在这里插入图片描述

5.2 单调队列

维护一个单调队列,保证单调队列里的数据是递增或递减,通过这个单调队列实现时间复杂度的优化。

case1:滑动窗口最大值
对于滑动窗口内的元素,维护一个双端队列,队列存放元素的下标,保证队列下标对应的元素是单调递减的。这样只要在滑动窗口内,队首下标对应的元素就是最大值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3 动态规划

5.3.1 一维动态规划

case1:最长递增子序列
定义 dp[i] 为考虑前 i 个元素,以第 i 个数字结尾的最长上升子序列的长度。O(n2)的时间复杂度动态更新这个一维动态数组。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.3.2 二维动态规划

case1 编辑距离
考察二维动态规划数组的应用。构建二维数组,通过动态规划来计算。对于每一个位置,只有3种可能的情况,左边加1,上边加1,左上角加0或加1,取3种情况中的最小值进行更新。
在这里插入图片描述
在这里插入图片描述

5.4 回朔

回朔模板:
在这里插入图片描述

case1:复原 IP 地址
在这里插入图片描述
在这里插入图片描述

5.5 背包问题

背包问题定义:
给定一个背包容量target,再给定一个数组nums(物品),能否按一定方式选取nums中的元素得到target

常见的背包类型主要有以下几种:
1、0/1背包问题:每个元素最多选取一次
2、完全背包问题:每个元素可以重复选择
3、组合背包问题:背包中的物品要考虑顺序
4、分组背包问题:不止一个背包,需要遍历每个背包

而每个背包问题要求的也是不同的,按照所求问题分类,又可以分为以下几种:
1、最值问题:要求最大值/最小值
2、存在问题:是否存在…………,满足…………
3、组合问题:求所有满足……的排列组合

在这里插入图片描述

5.5.1 完全背包问题

在这里插入图片描述
在这里插入图片描述

5.5.2 0-1背包问题

状态定义:布尔数组 dp[i][j] 表示区间 nums[0…i] 里是否存在若干个元素的和等于 j;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值