下面是程序锅自己对网上发布的200道高频面试题进行分类之后的结果。这200道,程序锅大概花了7个月刷完了,并且差不多每道题都过了好几遍。
刷题方法的话,主要就是先过思路,之后再统一AC,参考的是「陈同学在搬砖」提供的刷题方法。PS:刷题为了过面试是一回事,但其实日常写写算法/数据结构题也是不错的,可以让常见的数据结构和算法可以潜移默化的影响你,进而影响日常编码,也算是一种锻炼吧。
刷题题解的话,程序锅这块暂时没有整理,但是有分类,下面每个大类表格中,程序锅将相似题解或者思想的题目用空行隔开了。
题目
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-分发饼干(田忌赛马的味道)
22-括号生成(回溯-深度遍历)
90-子集2
39-组合总和
40-组合总和2
46-全排列
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-将有序数组转换为二叉搜索树(采用递归的方式,跟最大的二叉树类似)
offer68/235-二叉搜索树的最近公共祖先(递归、迭代)
236-二叉树的最近公共祖先(递归*2、存储父节点)
offer26-树的子结构(递归)
offer55/104-二叉树的深度/二叉树的最大深度(递归、层序遍历)
543-二叉树的直径(递归+求树的高度)
offer55/110-平衡二叉树(两种递归:自底而上,自顶而下)
offer28/101-对称的二叉树(一种递归、一种迭代)/对称二叉树
617-合并二叉树(递归)
313-超级丑数(堆;动态规划)
378-有序矩阵中第K小的元素(堆,但是这个堆的用法其实就是排序,可以和合并k个排序链表总结到一块;二分查找)
347-前K个高频元素(堆、哈希表)
409-最长回文串(哈希表)
offer05-替换空格
offer58/151-翻转单词顺序/翻转字符串里的单词
offer48/3-最长不含重复字符的子字符串/无重复字符的最长子串(哈希表、滑动窗口)
187-重复的DNA序列(哈希表)
567-字符串的排列(哈希表、滑动窗口)
offer58-左旋转字符串
20-有效的括号(栈)
125-验证回文串(双指针)
344-反转字符串(双指针)
415-字符串相加
38-外观数列
767-重构字符串(堆、贪心算法、排序)
offer45-把数组排成最小的数
179-最大数
offer21-调整数组顺序使奇数位于偶数前面(快排思想)
offer40-最小的K个数(快排)
215-数组中的第K个最大元素(快排思想)
283-移动零(双指针-快排思想)
75-颜色分类(快排思想的双指针)
offer53/34-在排序数组中查找数字/在排序数组中查找元素的第一个和最后一个位置(先找左边界、再找右边界)
offer53-0~n-1中缺失的数字
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-两整数之和(位运算)
476-数字的补数(位运算)
26-删除排序数组中的重复项(双指针)
16-最接近的三数之和(先排序+三指针)
15-三数之和(先排序+单层循环+双指针)
18-四数之和(先排序+两层循环+双指针)
offer57-和为s的两个数字(对撞指针)
offer57-和为s的连续正数序列(滑动窗口)
11-盛最多水的容器(双指针)
7-整数反转(数学)
9-回文数(数学)
171-Excel表列序号(数学)
728-自除数(简单的循环)
326-3的幂(数学)
263-丑数(数学)
412-FizzBuzz(纯循环)
69-x的平方根(数学、二分查找)
258-各位相加(一种是循环;一种是找规律)
202-快乐数(判断循环问题就用双指针;哈希表)
292-Nim游戏(数学找规律)
offer61-扑克牌中的顺子(找规律)
31-下一个排列(就是如何找紧接着的下一个数字)
offer39/169-数组中出现次数超过一半的数字/多数元素(摩尔投票法、排序)