以下是对唐叔近期发表的一系列算法文章的总结,包括算法概念、使用场景以及对应的LeetCode题目清单,欢迎作为你算法刷题的参考哦。
如对相关的算法章节感兴趣,欢迎订阅唐叔的专栏【唐叔学算法】
0. Java常见数据结构
1. 递归算法
算法概念:递归算法是通过将问题分解为更小的、相似的子问题来解决的方法。
使用场景:
- 树结构和图结构:二叉树遍历、图的深度优先搜索(DFS)。
- 分治算法:归并排序、快速排序。
- 动态规划问题:某些动态规划问题可以通过递归+记忆化的方式来优化。
- 数学问题:计算阶乘、斐波那契数列等。
LeetCode题目清单:
2. 分治算法
算法概念:分治算法是一种算法设计技术,通过将原问题分解为若干个规模较小、相互独立的子问题来解决。
使用场景:
- 排序算法:快速排序、归并排序。
- 搜索问题:二分查找。
- 数学问题:大整数乘法、矩阵乘法。
- 数据结构操作:二叉树的各种遍历、平衡树的旋转。
LeetCode题目清单:
- 88. 合并两个有序数组
- 53. 最大子序和
- 23. 合并K个升序链表
- 56. 合并区间
- 98. 验证二叉搜索树
- 162. 寻找峰值
- 169. 多数元素
- 215. 数组中的第K个最大元素
- 240. 搜索二维矩阵 II
- 241. 为运算表达式设计优先级
- 312. 戳气球
- 410. 分割数组的最大值
- 912. 排序数组
- 1101. 彼此熟识的最早时间
- 1584. 连接所有点的最小费用
- 1698. 字符串的不同同源字符串数目
3. 单调栈
算法概念:单调栈是一种栈结构,只允许元素单调递增或单调递减。
使用场景:
- 元素的相对顺序、下标索引问题。
- 寻找每个元素右边第一个比它大/小的元素。
- 计算直方图中最大的矩形面积。
- 求解滑动窗口的最大值。
LeetCode题目清单:
- 496. 下一个更大元素 I
- 84. 柱状图中最大的矩形
- 42. 接雨水
- 85. 最大矩形
- 316. 去除重复字母
- 402. 移掉K位数字
- 503. 下一个更大元素 II
- 739. 每日温度
- 907. 子数组的最小值之和
4. 滑动窗口
原链接:【唐叔学算法】第五天:滑动窗口算法-轻松解决数组与字符串的子区间问题
算法概念:滑动窗口是一种用于处理数组或字符串的子区间问题的算法技巧,通过维护一个窗口来高效地找到满足条件的子区间。
使用场景:
- 寻找最小子串:如包含所有特定字符的最小子串。
- 计算子数组的和:如和大于等于某个目标值的最短子数组。
- 统计子区间数量:如满足某种条件的子区间的数量。
- 连续子字符串问题:如判断字符串中是否存在和为特定值的连续子字符串。
LeetCode题目清单:
- 3. 无重复字符的最长子串
- 76. 最小覆盖子串
- 209. 长度最小的子数组
- 239. 滑动窗口最大值
- 340. 至多包含 K 个不同字符的最长子串
- 438. 找到字符串中所有字母异位词
- 567. 字符串的排列
- 727. 最小窗口子序列
- 1004. 最大连续1的个数 III
- 1218. 最长定差子序列
5. 前缀和
原链接:【唐叔学算法】第六天:前缀和-简化数组问题的黄金钥匙
算法概念:前缀和算法通过预先计算数组元素的累积和,从而快速得到任意连续区间的和。
使用场景:
- 快速计算数组任意区间的和。
- 确定数组中某个元素的累积和。
- 优化双指针问题。
LeetCode题目清单:
- 1480. 一维数组的动态和
- 560. 和为K的子数组
- 303. 区域和检索 - 数组不可变
- 304. 二维区域和检索 - 矩阵不可变
- 523. 连续的子数组和
- 525. 连续数组
- 974. 和可被 K 整除的子数组
- 1248. 统计"优美子数组"
- 1281. 整数的各位积和
- 1356. 有多少小于当前数字的数字
6. 差分算法
原链接:【唐叔学算法】第七天:差分算法-高效处理数组区间更新的利器
算法概念:差分算法是一种处理数组区间更新的算法,通过差分数组实现区间的增减操作。
使用场景:
- 区间更新:对数组中的一段区间内的所有元素执行相同的加减操作。
- 区间统计:统计数组中某个区间内满足某种条件的元素个数。
- 前缀和或后缀和:通过差分数组快速计算。
LeetCode题目清单:
- 1109. 航班预订统计
- 1456. 定长子串中元音的最大数目
- 370. 区间加法
- 731. 我的日程安排表 II
- 1094. 拼车
- 1103. 分糖果
- 1157. 单字符重复子字符串的最小长度
- 1160. 拼写单词
- 1287. 有序数组中出现次数超过25%的元素
- 1631. 最小体力消耗路径
- 1854. 人口最多的年份
7. 并查集
算法概念:并查集是一种用于处理不交集合并及查询的数据结构,支持合并和查询操作。
使用场景:
- 动态连通性问题:处理动态加入或删除边的情况。
- 网络流问题:判断两个节点是否在同一个网络流中。
- 图的连通性检测:判断两个顶点是否在同一个连通分量内。
- 社交网络分析:判断两个用户是否属于同一个社交圈。
- 等价类划分:将具有相同属性的元素划分到同一个集合中。
LeetCode题目清单:
8. 二分查找
算法概念:二分查找是一种在有序数组中查找特定元素的搜索算法,通过每次迭代将搜索范围缩小一半。
使用场景:
- 数据库索引:提高数据检索速度。
- 排序后的数组搜索:电话簿中的姓名查找。
- 解决其他问题的基础:许多高级算法和数据结构都基于二分查找的思想。
LeetCode题目清单:
- 704. 二分查找
- 34. 在排序数组中查找元素的第一个和最后一个位置
- 33. 搜索旋转排序数组
- 35. 搜索插入位置
- 69. x 的平方根
- 81. 搜索旋转排序数组 II
- 153. 寻找旋转排序数组中的最小值 II
- 278. 第一个错误的版本
9. 广度优先遍历
原链接:【唐叔学算法】第十天:广度优先遍历-探索图结构的逐层之旅
算法概念:广度优先遍历(BFS)是一种图和树的遍历算法,从起始节点开始,逐层访问所有邻居节点,直到访问完所有可达节点。
使用场景:
- 图论问题:判断节点连通性、最短路径、拓扑排序。
- 搜索问题:迷宫问题、八皇后问题。
- 动态规划问题:背包问题、最长公共子序列。
- 层次遍历:二叉树层序遍历。
- 游戏AI:寻路算法。
LeetCode题目清单:
- 102. 二叉树的层序遍历
- 994. 腐烂的橘子
- 126. 单词接龙 II
- 127. 单词接龙
- 128. 最长连续序列
- 286. 墙与门
- 417. 太平洋大西洋水流问题
- 490. 迷宫
- 542. 01矩阵
- 630. 课程表 III
- 752. 打开转盘锁
- 815. 公交路线
10. 深度优先遍历
原链接:【唐叔学算法】第11天:深度优先遍历-探索图与树的神秘深处
算法概念:深度优先遍历(DFS)是一种图和树的遍历算法,从起始节点开始,尽可能深地搜索图的分支。
使用场景:
- 搜索问题:寻找所有路径、迷宫问题、八皇后问题。
- 图论问题:图的连通性、节点连通性、拓扑排序。
- 动态规划问题:背包问题、最长公共子序列。
- 树形结构问题:遍历二叉树、多叉树。
- 游戏AI:国际象棋中的Minimax算法。
LeetCode题目清单:
- 104. 二叉树的最大深度
- 200. 岛屿数量
- 79. 单词搜索
- 130. 被围绕的区域
- 417. 太平洋大西洋水流问题
- 463. 岛屿的周长
- 547. 省份数量
- 684. 冗余连接
- 690. 员工的重要性
- 695. 岛屿的最大面积
11. 回溯算法
原链接:【唐叔学算法】第12天:回溯算法-探索所有可能的旅程
算法概念:回溯算法是一种通过试错来解决问题的方法,逐步构建解决方案,并在发现当前选择无法通向正确答案时撤销选择。
使用场景:
- 排列与组合:生成所有可能的数字或字母组合。
- 棋盘问题:八皇后问题。
- 迷宫求解:寻找从起点到终点的所有路径。
- 约束满足问题:数独游戏。
- 搜索问题:寻找满足特定条件的解空间。
LeetCode题目清单:
12. 拓扑排序
原链接:【唐叔学算法】第13天:拓扑排序-解锁有向图的线性秩序
算法概念:拓扑排序是有向无环图(DAG)的顶点的线性排序,使得对于每一个有向边 u -> v,顶点 u 都在顶点 v 之前。
使用场景:
- 任务调度:有依赖关系的任务中确定执行顺序。
- 课程安排:根据先修课要求确定学生选课的顺序。
- 编译器优化:决定函数调用或指令执行的次序。
- 项目规划:安排任务的时间表,确保所有前置任务完成后再开始后续工作。
LeetCode题目清单:
13. 贪心算法
原链接:【唐叔学算法】第14天:贪心算法-抓住每一个最优的选择
算法概念:贪心算法是一种在每一步决策时都选取当前看来最佳的选择,而不考虑未来后果的启发式方法。
使用场景:
- 资源分配:背包问题中的物品选择。
- 调度问题:安排任务的时间表以最小化总完成时间。
- 路径规划:寻找从起点到终点的最短路径。
- 数据压缩:霍夫曼编码等。
LeetCode题目清单:
- 455. 分发饼干
- 55. 跳跃游戏
- 45. 跳跃游戏 II
- 53. 最大子数组和
- 134. 加油站
- 135. 分发糖果
- 435. 无重叠区间
- 452. 用最少数量的箭引爆气球
- 763. 划分字母区间
- 860. 柠檬水找零
14. 动态规划
原链接:【唐叔学算法】第15天:动态规划-构建复杂问题的最优解之路
算法概念:动态规划是一种求解最优化问题的方法,通过将大问题分解为更小的问题,并保存这些子问题的解以避免重复计算。
使用场景:
- 最优化问题:最长公共子序列、最大子序和。
- 计数问题:不同的路径、组合数。
- 决策问题:硬币找零、背包问题。
LeetCode题目清单:
15. 枚举算法
算法概念:枚举算法通过遍历所有可能的候选解来寻找正确答案。
使用场景:
- 穷举搜索:暴力破解密码。
- 组合与排列生成:生成所有可能的数字或字母组合。
- 验证唯一性:检查给定集合内的元素是否唯一。
- 路径寻找:探索图中的所有路径。
LeetCode题目清单:
结语
好啦,以上就是唐叔近期发表的文章的总结啦,如果你觉得归纳的不错,欢迎一键三连哦。我是唐叔,微信公众号【唐叔在学习】,欢迎和我一起学习、一起进步。