目录

LeetCode 200 道高频题【按照 Tag 分类】

自己整理的高频题

下面是程序锅自己对网上大佬发布的 200 道高频面试题进行分类之后的结果。这 200 道,程序锅大概花了 7 个月刷完了,并且差不多每道题都过了好几遍。

刷题方法的话,主要就是先过思路,之后再统一 AC,参考的是「陈同学在搬砖」提供的刷题方法。PS:刷题为了过面试是一回事,但其实日常写写算法/数据结构题也是不错的,可以让常见的数据结构和算法可以潜移默化的影响你,进而影响日常编码,也算是一种锻炼吧。

刷题题解的话,程序锅这块暂时没有整理,但是有分类,下面每个大类表格中,程序锅将相似题解或者思想的题目用空行隔开了。

刷题代码仓库,这个程序锅一直有在 commit,欢迎 star:https://github.com/dawnguodev/algorithm

假如你没时间刷这么多题的话,建议可以按照这份整理先做链表、树相关的题目,然后再做动态规划相关的题目,再然后做数组相关的题目,最后再做其他题目

动态规划

  1. DP 问题汇总(https://leetcode-cn.com/circle/article/NfHhXD/)
  2. 股票买卖问题
  3. 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-比特位计数(位运算、动态规划)

贪心

题目
55-跳跃游戏
455-分发饼干(田忌赛马的味道)
406-根据身高重建队列 https://leetcode-cn.com/problems/queue-reconstruction-by-height/solution/xian-pai-xu-zai-cha-dui-dong-hua-yan-shi-suan-fa-g/,渔(套路):一般这种数对,还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程。

回溯

题目
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-数组中出现次数超过一半的数字/多数元素(摩尔投票法、排序)

其他

含题解的分类

  1. https://github.com/youngyangyang04/leetcode-master

    鹏神分享的 Github 链接

LeetCode 分类列表

  1. 花花酱 LeetCode Problem List 题目列表:https://zxi.mytechroad.com/blog/leetcode-problem-categories/

  2. 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

  3. Cspiration 题目列表:https://cspiration.com/leetcodeClassification