自己整理的高频题
下面是程序锅自己对网上大佬发布的 200 道高频面试题进行分类之后的结果。这 200 道,程序锅大概花了 7 个月刷完了,并且差不多每道题都过了好几遍。
刷题方法的话,主要就是先过思路,之后再统一 AC,参考的是「陈同学在搬砖」提供的刷题方法。PS:刷题为了过面试是一回事,但其实日常写写算法/数据结构题也是不错的,可以让常见的数据结构和算法可以潜移默化的影响你,进而影响日常编码,也算是一种锻炼吧。
刷题题解的话,程序锅这块暂时没有整理,但是有分类,下面每个大类表格中,程序锅将相似题解或者思想的题目用空行隔开了。
刷题代码仓库,这个程序锅一直有在 commit,欢迎 star:https://github.com/dawnguodev/algorithm
假如你没时间刷这么多题的话,建议可以按照这份整理先做链表、树相关的题目,然后再做动态规划相关的题目,再然后做数组相关的题目,最后再做其他题目。
动态规划
- DP 问题汇总(https://leetcode-cn.com/circle/article/NfHhXD/)
- 股票买卖问题
- 0-1背包九讲
题目 |
---|
718-最长重复子数组(最值不一定是末尾) |
offer42/53-连续子数组的最大和/最大子序和(最值不一定是末尾) |
152-乘积最大子数组(最值不一定是末尾) |
300-最长递增子序列(最值不一定是末尾) |
334-递增的三元子序列 |
221-最大正方形 |
5-最长回文子串 |
647-回文子串 |
72-编辑距离 |
343-剪绳子/整数拆分 |
91-解码方法 |
offer10-斐波那契数列 |
64-最小路径和 |
offer47-礼物的最大价值 |
62-不同路径 |
96-不同的二叉搜索树(树、动态规划) |
95-不同的二叉搜索树 2(树、动态规划) |
121-买卖股票的最佳时机(数组、动态规划)/股票的最大利润(动态规划) |
122-买卖股票的最佳时机 2(贪心、数组) |
198-打家劫舍(动态规划) |
213-打家劫舍 2(动态规划) |
337-打家劫舍 3(树、深度) |
416-分割等和子集(01背包---使用一维dp数组的话:外层循环只能是遍历物品,内层循环是从大到小遍历背包容量;遍历背包的顺序是从大到小,因为倒序遍历确保是为了保证物品i只被放一次。二维dp数组的话:外层遍历物品 ,内层遍历背包容量 和 外层遍历背包容量 ,内层遍历物品都是可以的。都是从小到大。) |
1049-最后一块石头的重量2(01背包---一维dp数组同上) |
474-一和零(01背包---跟一维dp数组的方式类型,但是这里会有 3 层 for 循环) |
494-目标和(01背包---一维dp数组同上) |
518. 零钱兑换 II(完全背包,如果求组合数就是外层for循环遍历物品,内层for遍历背包(从小到大)) |
377. 组合总和 Ⅳ(完全背包,如果求排列数就是外层for遍历背包,内层for循环遍历物品) |
offer10/70-青蛙跳台阶/爬楼梯(完全背包,排列数) |
322-零钱兑换(完全背包) |
279-完全平方数(完全背包) |
139-单词拆分(完全背包) |
(完全背包问题中,假如使用了一维dp数组,两个 for 循环嵌套的顺序是无所谓的,需要从小到大遍历) |
338-比特位计数(位运算、动态规划) |
贪心
回溯
题目 |
---|
22-括号生成(回溯-深度遍历) |
78-子集 https://leetcode-cn.com/problems/subsets/solution/hui-su-suan-fa-by-powcai-5/ |
90-子集 2 |
39-组合总和 |
40-组合总和 2 |
46-全排列 |
17-电话号码的字母组合(回溯算法) |
79-单词搜索(深度) |
200-岛屿数量(深度、广度) |
数组
题目 |
---|
offer04/240-二维数组中的查找/搜索二维矩阵 2(将二维数组转换为二叉搜索树) |
offer29/54-顺时针打印矩阵/螺旋矩阵(数组操作) |
48-旋转图像(数组操作) |
118-杨辉三角(数组) |
717-1比特与2比特字符(数组遍历) |
66-加一(数组操作) |
56-合并区间(排序再遍历) |
189-旋转数组(翻转整个数组+翻转前k个元素+翻转剩下的;环状替换:就是从头开始一个一个座位往后移 k) |
offer03-数组中重复的数字(计数、反复交换) |
287-寻找重复数(跟“数组中重复的数字”类似,但是稍微有点区别) |
448-找到所有数组中消失的数字(值对应到下标,再考察下标对应值的情况) |
88-合并两个有序数组(双指针) |
offer66/238-构建乘积数组/除自身以外数组的乘积(拆成两部分相乘的结果) |
offer64-求1+2+…+n(递归+逻辑运算) |
链表
题目 |
---|
237-删除链表中的节点(基本操作)-1 |
203-移除链表元素(基本操作)-1 |
offer18-删除链表的节点(基本操作)-1 |
83-删除排序链表中的重复元素(基本操作)-1 |
offer06-从尾到头打印链表(基本操作)-1 |
206-反转链表(双指针、递归)-1 |
92-反转链表2(双指针、递归)-2 |
24-两两交换链表中的节点(双指针、递归) |
25-K 个一组翻转链表 |
offer22-链表中倒数第k个节点(双指针-间隔) |
61-旋转链表(双指针-间隔) |
19-删除链表的倒数第 N 个节点(双指针-间隔) |
Offer25/21-合并两个排序的链表/合并两个有序链表(双指针) |
23-合并K个升序链表(堆) |
2-两数相加(链表) |
86-分隔链表(双指针) |
328-奇偶链表(双指针) |
143-重排链表(双指针-快慢) |
234-回文链表(双指针) |
141-环形链表(双指针-快慢指针) |
142-环形链表 2(双指针-快慢指针,但有种相交链表的感觉) |
offer52/160-两个链表的第一个公共节点/相交链表(双指针) |
148-排序链表(排序、链表) |
146-LRU 缓存机制(设计) |
栈、队列
题目 |
---|
225-用队列实现栈(两个队列,一个队列可(这个主要是因为队列两端都可操作)) |
232/offer09-栈实现队列/用两个栈实现队列(两个栈,一个栈不行(因为栈只能一端操作)) |
offer31/946-栈的压入、弹出序列(用一个栈模拟入栈和出栈过程,入栈则是按照入栈的顺序,当栈顶和出栈顺序一样则弹出) |
150-逆波兰表达式求值(栈) |
227-基本计算器 2(栈) |
739-每日温度(栈) |
402-移掉K位数字(单调栈) |
offer30/155-包含min函数的栈/最小栈(两个栈,一个栈就是纯栈,一个栈的栈顶存遇到的最小值) |
offer59/239-滑动窗口的最大值(队列) |
394-字符串解码(栈;深度) |
581-最短无序连续子数组(选择排序的思想;排序;单调栈;对数组进行分段,找出左边界和右边界) |
树
题目 |
---|
144-二叉树的前序遍历(递归、迭代、莫里斯) |
94-二叉树的中序遍历(递归、迭代、莫里斯) |
145-二叉树的后序遍历(递归、迭代、莫里斯) |
offer32-从上到下打印二叉树(queue) |
offer32-二叉树的层序遍历/从上到下打印二叉树 2(queue) |
offer32-二叉树的锯齿形层次遍历/从上到下打印二叉树 3(queue) |
114-二叉树展开为链表(莫里斯遍历、后序变体、前序的栈方式) |
offer36-二叉搜索树与双向链表(中序遍历的框架) |
538/1038-把二叉搜索树转换为累加树(中序变体) |
199-二叉树的右视图(深度、广度) |
offer34/113-路径总和 2/二叉树中和为某一值的路径(DFS-先序---遍历框架) |
offer27/226-二叉树的镜像/翻转二叉树(递归、迭代---遍历框架) |
offer54-二叉搜索树的第K大节点(中序遍历的逆序的框架) |
230-二叉搜索树中第 K 小的元素(类似与第 K 大的元素) |
109-有序链表转换二叉搜索树(递归+快慢指针、中序遍历框架) |
98-验证二叉搜索树(中序遍历的结果、递归的方式) |
offer33-二叉搜索树的后序遍历序列(递归、单调栈) |
offer07/105-重建二叉树/从前序与中序遍历序列构造二叉树(递归方式) |
654-最大二叉树(递归,类似之前的重建二叉树) |
108-将有序数组转换为二叉搜索树(采用递归的方式,跟最大的二叉树类似) |
109-有序链表转换二叉搜索树(递归+快慢指针、中序遍历框架) |
offer68/235-二叉搜索树的最近公共祖先(递归、迭代) |
236-二叉树的最近公共祖先(递归*2、存储父节点) |
offer26-树的子结构(递归) |
offer55/104-二叉树的深度/二叉树的最大深度(递归、层序遍历) |
543-二叉树的直径(递归 + 求树的高度) |
offer55/110-平衡二叉树(两种递归:自底而上,自顶而下) |
offer28/101-对称的二叉树(一种递归、一种迭代)/对称二叉树 |
617-合并二叉树(递归) |
98-验证二叉搜索树(中序遍历的结果、递归的方式) |
堆
题目 |
---|
313-超级丑数(堆;动态规划) |
378-有序矩阵中第 K 小的元素(堆,但是这个堆的用法其实就是排序,可以和合并k个排序链表总结到一块;二分查找) |
23-合并K个升序链表(堆) |
347-前 K 个高频元素(堆、哈希表) |
字符串
题目 |
---|
409-最长回文串(哈希表) |
offer05-替换空格 |
offer58/151-翻转单词顺序/ 翻转字符串里的单词 |
offer48/3-最长不含重复字符的子字符串/ 无重复字符的最长子串(哈希表、滑动窗口) |
187-重复的DNA序列(哈希表) |
567-字符串的排列(哈希表、滑动窗口) |
offer58-左旋转字符串 |
20-有效的括号(栈) |
125-验证回文串(双指针) |
344-反转字符串(双指针) |
415-字符串相加 |
38-外观数列 |
767-重构字符串(堆、贪心算法、排序) |
排序
题目 |
---|
offer45-把数组排成最小的数 |
179-最大数 |
581-最短无序连续子数组(选择排序的思想;排序;单调栈;对数组进行分段,找出左边界和右边界) |
offer21-调整数组顺序使奇数位于偶数前面(快排思想) |
offer40-最小的K个数(快排) |
215-数组中的第K个最大元素(快排思想) |
283-移动零(双指针-快排思想) |
75-颜色分类(快排思想的双指针) |
二分查找
题目 |
---|
35-搜索插入位置(二分查找:https://leetcode-cn.com/problems/search-insert-position/solution/hua-jie-suan-fa-35-sou-suo-cha-ru-wei-zhi-by-guanp/) |
offer53/34-在排序数组中查找数字/在排序数组中查找元素的第一个和最后一个位置(先找左边界、再找右边界) |
offer53-0~n-1 中缺失的数字 |
287-寻找重复数(跟“数组中重复的数字”类似,但是稍微有点区别) |
162-寻找峰值 |
33-搜索旋转排序数组 |
offer11/154-旋转数组的最小数字 |
哈希
题目 |
---|
771-宝石与石头(哈希表) |
575-分糖果(哈希表) |
242-有效的字母异位词(排序;哈希表+字符串) |
49-字母异位词分组(哈希表+字符串) |
1-两数之和(哈希) |
454-四数相加 II(哈希表,与两数相加那些题有点类似) |
560-和为K的子数组(两层循环;先算好连加的情况,之后使用双指针遍历;与“两数之和”类似的方式) |
217-存在重复元素(哈希表) |
763-划分字母区间(哈希+双指针) |
349-两个数组的交集(哈希) |
offer50-第一个只出现一次的字符(哈希表) |
位运算
题目 |
---|
offer56-数组中数字出现的次数(位异或) |
offer56-数组中数字出现的次数 2/只出现一次的数字 2(位运算) |
136-只出现一次的数字 |
461-汉明距离(位运算) |
offer15-二进制中1的个数(位运算) |
371-两整数之和(位运算) |
offer65-不用加减乘除做加法(位运算,https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/solution/mian-shi-ti-65-bu-yong-jia-jian-cheng-chu-zuo-ji-7/) |
476-数字的补数(位运算) |
双指针、滑动窗口
题目 |
---|
26-删除排序数组中的重复项(双指针) |
16-最接近的三数之和(先排序+三指针) |
15-三数之和(先排序+单层循环+双指针) |
18-四数之和(先排序+两层循环+双指针) |
offer57-和为s的两个数字(对撞指针) |
offer57-和为s的连续正数序列(滑动窗口) |
560-和为K的子数组(两层循环;先算好连加的情况,之后使用双指针遍历;与“两数之和”类似的方式) |
11-盛最多水的容器(双指针) |
数学
题目 |
---|
7-整数反转(数学) |
9-回文数(数学) |
171-Excel表列序号(数学) |
728-自除数(简单的循环) |
326-3的幂(数学) |
263-丑数(数学) |
412-Fizz Buzz(纯循环) |
69-x 的平方根(数学、二分查找) |
offer16/50-数值的整数次方/Pow(x,n)(递归会更好理解一点;https://leetcode-cn.com/problems/powx-n/solution/50-powx-n-kuai-su-mi-qing-xi-tu-jie-by-jyd/) |
258-各位相加(一种是循环;一种是找规律) |
202-快乐数(判断循环问题就用双指针;哈希表) |
172-阶乘后的零(这题其实就是数学找规律差不多,进行转换。小红书原题:https://leetcode-cn.com/problems/factorial-trailing-zeroes/solution/xiang-xi-tong-su-de-si-lu-fen-xi-by-windliang-3/) |
292-Nim 游戏(数学找规律) |
offer61-扑克牌中的顺子(找规律) |
31-下一个排列(就是如何找紧接着的下一个数字) |
offer39/169-数组中出现次数超过一半的数字/多数元素(摩尔投票法、排序) |
其他
含题解的分类
-
https://github.com/youngyangyang04/leetcode-master
鹏神分享的 Github 链接
LeetCode 分类列表
-
花花酱 LeetCode Problem List 题目列表:https://zxi.mytechroad.com/blog/leetcode-problem-categories/
-
cyc2018 Github 仓库:https://github.com/CyC2018/CS-Notes/blob/master/notes/Leetcode%20%E9%A2%98%E8%A7%A3%20-%20%E7%9B%AE%E5%BD%95.md
-
Cspiration 题目列表:https://cspiration.com/leetcodeClassification