自己整理的高频题
下面是程序锅自己对网上大佬发布的 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 
 
            