经典算法题思路整理-Leetcode力扣经典算法题目整理

  • 自己能在面试中A4纸写出来的代码才是好代码,不要一味追求复杂度低的代码,如果写都写不出来更不用谈复杂度。
  • 第一遍先大概粗过一遍题目思路,第二遍再刷代码。
  • 标注出不熟悉的题目,隔天复习,加强记忆。

数组
数学
字符串
链表
二叉树
回溯、搜索
动态规划
堆栈快排等
其他

数组

Description Solution
287. 寻找重复数 hashmap、排序、二分变形
283. 移动零 双指针、冒泡
剑指 Offer 50. 第一个只出现一次的字符 哈希
1. 两数之和 哈希
167. 两数之和 II - 输入有序数组、剑指 Offer 57. 和为s的两个数字 哈希或双指针
!!!581. 最短无序连续子数组 双指针
88. 合并两个有序数组 双指针
977. 有序数组的平方
!!! 75. 颜色分类 荷兰旗问题
!!!334. 递增的三元子序列 三指针
---------------------------------------------
剑指 Offer 57 - II. 和为s的连续正数序列 滑动窗口
集合交集 哈希、排序
剑指 Offer 66. 构建乘积数组、LeetCode 238. 除自身以外数组的乘积 乘积=当前数左边的乘积*当前数右边的乘积
Leetcode 35. 搜索插入位置 二分
4. 寻找两个正序数组的中位数 二分
34. 在排序数组中查找元素的第一个和最后一个位置 二分
153. 寻找旋转排序数组中的最小值 旋转数组查找
剑指 Offer 11. 旋转数组的最小数字、154. 寻找旋转排序数组中的最小值 II
33. 搜索旋转排序数组
剑指 Offer 53 - I. 在排序数组中查找数字 I 两次二分
剑指 Offer 53 - II. 0~n-1中缺失的数字 二分
1300. 转变数组后最接近目标值的数组和 枚举+二分
剑指 Offer 59 - I. 滑动窗口的最大值、239. 滑动窗口最大值 二分
162. 寻找峰值 二分变形
410. 分割数组的最大值 二分变形
剑指 Offer 04. 二维数组中的查找、240. 搜索二维矩阵 II 二分变形
数组超过一半的数字/求众数 hashmap、排序
旋转数组 三次旋转
统计邻居状态 neighbor函数、CNN卷积
救生艇 贪心+双指针
----------------------------------- 先排序后操作
56. 合并区间 排序后贪心
57. 插入区间 合并区间
406. 根据身高重建队列 先排序后插入
452. 用最少数量的箭引爆气球 先排序后贪心
Python自定义排序 模板
1030. 距离顺序排列矩阵单元格 自定义排序
164. 最大间距 桶排序
-----------------------------------
跳跃游戏 贪心
1024. 视频拼接 区间合并贪心
盛最多水的容器 贪心、双指针
统计「优美子数组」 组合个数
剑指 Offer 48. 最长不含重复字符的子字符串、3. 无重复字符的最长子串 滑动窗口或者以s[i]结尾的dp
209. 长度最小的子数组
和为K的子数组、连续的子数组和、和可被 K 整除的子数组 前缀和
----------------------------------------- 单调栈
739. 每日温度、496. 下一个更大元素 I
84. 柱状图中最大的矩形
239. 滑动窗口最大值
84. 柱状图中最大的矩形
85. 最大矩形
42. 接雨水
-------------------------------------------
求1+2+…+n 递归求和
128. 最长连续序列 集合
单词接龙 构造BFS
最佳观光组合 迭代
15. 三数之和、16. 最接近的三数之和 回溯或者双指针
------------------------------------ 原地哈希
41. 缺失的第一个正数
剑指 Offer 03. 数组中重复的数字
442. 数组中重复的数据
448. 找到所有数组中消失的数字
--------------------------------
剑指 Offer 39. 数组中出现次数超过一半的数字 摩尔投票法(正负相抵消)
----------------------------------- 模拟
36. 有效的数独
48. 旋转图像/旋转矩阵 辅助空间、原地翻转
49. 字母异位词分组
171. Excel表列序号
454. 四数相加 II
剑指 Offer 61. 扑克牌中的顺子
------------------------------------- 模拟
54. 螺旋矩阵 模拟
134. 加油站 不容易想到的算法
31. 下一个排列 不容易想到的算法
380. 常数时间插入、删除和获取随机元素 数组+哈希表
384. 打乱数组 洗牌算法
169. 多数元素 布尔投票法

数学

Description Solution
n的平方根 二分、牛顿法
50. Pow(x, n) 二分快速幂
剑指 Offer 16. 数值的整数次方 二分快速幂
two sum hashmap
剑指 Offer 14- I. 剪绳子、343. 整数拆分 分解为2和3
RandX==>RandY randN相互生成
29. 两数相除 不使用除法做除法
172. 阶乘后的零
204. 计数质数 素数筛法
166. 分数到小数 模拟除法
剑指 Offer 43. 1~n整数中1出现的次数、233. 数字 1 的个数 手动推导思路
149. 直线上最多的点数 直线斜率
268. 缺失数字 原地哈希、位运算、求和
面试题 16.11. 跳水板 数学推导
数字二进制中1的个数 右移位运算
136. 只出现一次的数字 异或
136. 只出现一次的数字 异或
剑指 Offer 56 - I. 数组中数字出现的次数 异或
461. 汉明距离 异或
剑指 Offer 56 - II. 数组中数字出现的次数 II 位运算
剑指 Offer 65. 不用加减乘除做加法 异或、移位做加法
剑指 Offer 15. 二进制中1的个数、191. 位1的个数 右移
89. 格雷编码 右移

字符串

Description Solution
压缩字符串 list辅助记录cnt
208. 实现 Trie (前缀树) 前缀树
820. 单词的压缩编码 后缀树
212. 单词搜索 II 前缀树
336. 回文对 前缀树
最小覆盖子串 滑动窗口
剑指 Offer 19. 正则表达式匹配、10. 正则表达式匹配 回溯
44. 通配符匹配 回溯
----------------------------------- 模拟
13. 罗马数字转整数
49. 字母异位词分组
387. 字符串中的第一个唯一字符
242. 有效的字母异位词
剑指 Offer 67. 把字符串转换成整数
剑指 Offer 58 - I. 翻转单词顺序
剑指 Offer 58 - II. 左旋转字符串
696. 计数二进制子串 模拟或者动态规划
459. 重复的子字符串
93. 复原IP地址 暴力模拟
468. 验证IP地址 模拟
43. 字符串相乘 模拟竖式乘法
--------------------------------
179. 最大数 自定义排序
剑指 Offer 45. 把数组排成最小的数 自定义排序
344. 反转字符串 双指针
剑指 Offer 58 - I. 翻转单词顺序 双指针
395. 至少有K个重复字符的最长子串 分治
剑指 Offer 20. 表示数值的字符串 自动机

链表

Description Solution
剑指 Offer 18. 删除链表的节点
删除重复节点I 使用头节点,更新pre.next即可
删除重复节点II
19. 删除链表的倒数第N个节点 使用头节点的快慢双指针
!!!剑指 Offer 24. 反转链表、206. 反转链表 使用头节点和辅助节点tmpNode=cur.next
!!!25. K 个一组翻转链表
----------------------------------- 链表回溯
剑指 Offer 06. 从尾到头打印链表
143. 重排链表
-----------------------------------
160. 相交链表 hashmap、双指针
剑指 Offer 52. 两个链表的第一个公共节点 双指针
141. 环形链表、142. 环形链表 II hashmap、快慢双指针
剑指 Offer 22. 链表中倒数第k个节点 快慢指针
!!!146. LRU缓存机制 双向链表+Hashmap
快乐数 快慢指针判断环
链表中间节点 快慢指针
234. 回文链表 枚举、双指针
328. 奇偶链表 双指针
21. 合并两个排序的链表、剑指 Offer 25. 合并两个排序的链表 模拟
剑指 Offer 35. 复杂链表的复制 模拟
链表两数相加 II
138. 复制带随机指针的链表 两种思路模拟
2. 两数相加 模拟
61. 旋转链表 链表=>环
二叉树
Description Solution
二叉树非递归遍历 前序中序后序
114. 二叉树展开为链表 前序
404. 左叶子之和 前序
------------------------------ 二叉树深度问题
剑指 Offer 55 - I. 二叉树的深度 后序maxDepth(root)、前序层次
222. 完全二叉树的节点个数 logn*logn
剑指 Offer 55 - II. 平衡二叉树、110. 平衡二叉树 后序
LeetCode 111. 二叉树的最小深度 层序
543. 二叉树的直径 后序遍历
662. 二叉树最大宽度 层序
------------------------------ 路径问题
257. 二叉树的所有路径
112.路径和 是否存在路径和
113. 路径总和 II、剑指 Offer 34. 二叉树中和为某一值的路径 打印出路径
437. 路径总和 III 打印出可以不经过根节点的路径
124. 二叉树中的最大路径和 后序遍历MaxGain(root),打印出可以不经过根节点的最大路径
-------------------------------
116. 填充每个节点的下一个右侧节点指针 层序遍历
剑指 Offer 32 - I. 从上到下打印二叉树
剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - III. 从上到下打印二叉树 III
199. 二叉树的右视图
103. 二叉树的锯齿形层次遍历
958. 二叉树的完全性检验
--------------------------------
105. 从前序与中序遍历序列构造二叉树、剑指 Offer 07. 重建二叉树 重建二叉树
106. 从中序与后序遍历序列构造二叉树
剑指 Offer 33. 二叉搜索树的后序遍历序列
--------------------------------
94. 二叉树的中序遍历 中序遍历
108. 将有序数组转换为二叉搜索树 中序遍历
98. 验证二叉搜索树 中序遍历
-------------------------------------
538. 把二叉搜索树转换为累加树 中序变形
剑指 Offer 54. 二叉搜索树的第k大节点
230. 二叉搜索树中第K小的元素、二叉搜索树第K个节点 中序遍历
------------------------------- 两颗二叉树问题
100. 相同的树 两个树结构和值是否完全相同
101. 对称二叉树 两个树是否对称
剑指 Offer 27. 二叉树的镜像 输出A树的镜像
572. 另一个树的子树、剑指 Offer 26. 树的子结构 A是否是B的子树
617. 合并二叉树 输出合并后新的二叉树
----------------------------------
99. 恢复二叉搜索树 中序遍历
1028. 从先序遍历还原二叉树 迭代模拟递归
二叉树的序列化与反序列化 层次遍历
-----------------------------------
235. 二叉搜索树的最近公共祖先、剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 搜索树
236. 二叉树的最近公共祖先、剑指 Offer 68 - II. 二叉树的最近公共祖先 后序遍历
226. 翻转二叉树 后序遍历

回溯、搜索

Description Solution
-------------------- 子集、排列、组合问题
78. 子集
90. 子集 II
491. 递增子序列 子集变形
842. 将数组拆分成斐波那契序列 子集变形
474. 一和零
46. 全排列
47. 全排列 II
60. 第k个排列
494. 目标和
39. 组合总和
40. 组合总和 II
216. 组合总和 III
剑指 Offer 38. 字符串的排列
77. 组合
电话号码字母组合/字母大小写全排列 集合选择元素组合
--------------------------------
51. N 皇后 经典回溯
79. 单词搜索 二维数组回溯
332. 重新安排行程
--------------------------------- BFS
200. 岛屿数量 二维数组BFS
130. 被围绕的区域 二维BFS或者并查集
733. 图像渲染 二维数组BFS
剑指 Offer 12. 矩阵中的路径 二维数组DFS回溯
785. 判断二分图 BFS染色
301. 删除无效的括号 BFS
133. 克隆图 DFS或者BFS
841. 钥匙和房间
腐烂的橘子、机器人的运动范围 正向BFS
最远的海洋、矩阵 反向BFS
-------------------------------------
5. 最长回文子串 回文串
9. 回文数 回文串
409. 最长回文串 回文串
131. 分割回文串 画出回溯树
--------------------------------------- 区间
647. 回文子串 区间DP
516. 最长回文子序列 区间DP
486. 预测赢家

动态规划

Description Solution
----------------------------------- 背包问题
01背包和完全背包代码区别
322. 零钱兑换 完全背包
518. 零钱兑换 II 完全背包
416. 分割等和子集 01最大背包
-----------------------------------
72. 编辑距离
剑指 Offer 60. n个骰子的点数 类似编辑
----------------————-------- 子序列和子串问题
718. 最长重复子数组 最长公共子串
1143. 最长公共子序列 最长公共子序列
子串问题dp[i][j]为以s1[i] s2[j]为结尾的子问题 子序列问题dp[i][j]不用以s1[i] s2[j]为结尾的子问题
674. 最长连续递增序列 注意与下面一个题目区别 O(n)
300. 最长上升子序列 O(n^2)
剑指 Offer 42. 连续子数组的最大和、53. 最大子序和
最大序列乘积
392. 判断子序列 类似最长公共子序列或者双指针
---------------------------------- 前面两个状态推后面一个状态
剑指 Offer 10- I. 斐波那契数列 迭代、递归、剪枝递归、通项公式、矩阵快速幂
剑指 Offer 10- II. 青蛙跳台阶问题、70. 爬楼梯
面试金典 17.16. 按摩师、198. 打家劫舍 dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
264. 丑数 II、剑指 Offer 49. 丑数
-----------------------------------
97. 交错字符串
扔鸡蛋
面试题 08.11. 硬币、322. 零钱兑换
最低票价
把数字翻译成字符串 类似于斐波那契数列
91. 解码方法 dp[i]:以s[i]结尾的解码数量
139. 单词拆分 dp[i]:以s[i]结尾的字符串能不能由字典表示
140. 单词拆分 II 记录每个状态的中间结果。需要回溯方法才能通过
20. 有效的括号
32. 最长有效括号 dp[i]: 以s[i]结尾的字符串有效括号的长度
----------------------------------- 路径问题
62. 不同路径、63. 不同路径 II
64. 最小路径和
120. 三角形最小路径和
329. 矩阵中的最长递增路径 回溯或者拓扑排序+二维矩阵DP
剑指 Offer 47. 礼物的最大价值 二维矩阵中DP
221. 最大正方形 二维矩阵中DP
面试题 17.13. 恢复空格 动态规划
----------------------------------- 股票问题
121. 买卖股票的最佳时机、剑指 Offer 63. 股票的最大利润 仅交易一次
122. 买卖股票的最佳时机 II 不限制交易次数
123. 买卖股票的最佳时机 III 2笔比交易
309. 最佳买卖股票时机含冷冻期 含有冷冻期
188. 买卖股票的最佳时机 IV 仅k次交易
714. 买卖股票的最佳时机含手续费 有手续费不限制次数的交易
-----------------------------------
174. 地下城游戏 反向DP
96. 不同的二叉搜索树 DP
95. 不同的二叉搜索树 II 回溯
338. 比特位计数 一维DP
312. 戳气球 自下向上DP
--------------------------------------- 区间DP
647. 回文子串
516. 最长回文子序列
486. 预测赢家 博弈论和区间DP
877. 石子游戏 博弈论和区间DP
----------------------------------------

堆、栈、快排

Description Solution
150. 逆波兰表达式求值 栈的应用
剑指 Offer 30. 包含min函数的栈、Leetcode 155. 最小栈 辅助最小栈
栈实现队列 、剑指 Offer 09. 用两个栈实现队列 辅助栈
剑指 Offer 31. 栈的压入、弹出序列 栈模拟
剑指 Offer 59 - II. 队列的最大值 单调队列
341. 扁平化嵌套列表迭代器
----------------------------------- 堆与快排
剑指 Offer 41. 数据流中的中位数、LeetCode 295. 数据流的中位数 大小堆
347. 前 K 个高频元素 小根堆
快速排序模板
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 快排思想
剑指 Offer 40. 最小的k个数 快排思想
LeetCode 215. 数组中的第K个最大元素 全排序、局部排序、堆、快排思想
--------------------------------
324. 摆动排序 II partition和二分
207. 课程表、210. 课程表 II 拓扑排序
227. 基本计算器 II
剑指 Offer 51. 数组中的逆序对 归并
23. 合并K个排序链表 优先队列或者归并
378. 有序矩阵中第K小的元素 二分或者归并
315. 计算右侧小于当前元素的个数 归并
148. 排序链表 归并

其他

Description Solution
矩形是否相交/矩形相交面积 IoU相关
统计邻居状态 neighbor函数、CNN 卷积
使数组唯一的最小增量 贪心
gcd/lcm/贝祖定理 最大公约数、最小公倍数、二元一次方程解
数组最大公约数 tmp=gcd(tmp,x)

你可能感兴趣的:(NOIP笔记,算法,数据结构)