MAX
算法模板化体系化刷题
大部分同学其实都没有写算法题的天赋,大部分人刷算法题也并不是出于兴趣而是面试需要,所以我认为体系化模版化的刷题才是应试的最佳思路,短时间内把没见过的算法题套到能用的模版上,这才是最适合普通人的核心解题思路。
所以出于自己准备算法的过程,我将 400+(持续更新)算法题按照模版进行体系化归纳整理,一个模板解决多个同类型题目,力求短时间内尽最大可能提升算法应试能力。
## 你将获得
- 体系化的刷题路线
- 超级好用的刷题模版
- 400+ 热门算法题的解题思路(持续更新)
## 课程介绍
大部分同学其实都没有写算法题的天赋,大部分人刷算法题也并不是出于兴趣而是面试需要,所以我认为体系化模版化的刷题才是应试的最佳思路,盲目学习别人的解题方法可能并不适合大部分的面试场景,**短时间内把没见过的算法题套到能用的模版上,这才是最简单性价比最高最适合普通人的核心解题思路**。
所以出于自己准备算法的过程,我将 400+(持续更新)算法题(来自于多个平台,LeetCode、牛客等)按照模版进行体系化归纳整理,**一个模板解决多个同类型题目**,力求短时间内尽最大可能提升算法应试能力。
现有分类如下:
- 整数 & 位运算
- 数组
- 链表
- 哈希表
- 字符串
- 栈
- 队列
- 二叉树
- 前缀树
- 二分查找
- 双指针法
- 区间求和问题
- 排序
- 回溯算法
- 贪心算法
- 动态规划
- 图
- 数学
- 自动机
- 海量数据和空间限制
## 学习建议
模板并不是万能的,大部分题适用于模板,但也有些题目不适用于模板,**模版的作用是引导而非约束,所以在模板的基础上进行发散和改造,而非将所有题目全都生搬硬套进模板,应该是同学们的终极学习目标**。
- 必看
- 刷题模板汇总试读
- 一些刷题小技巧试读
- 整数 & 位运算
- 整数除法
- 二进制加法
- 二进制中 1 的个数
- 前 n 个数字二进制中 1 的个数
- 只出现一次的数字
- 只出现一次的数字II
- 只出现一次的数字 III
- 数组中出现次数超过一半的数字
- 数值的整数次方:快速幂模板
- 1~n 整数中 1 出现的次数
- 数组
- 数组理论基础试读
- 第 k 个缺失的正整数
- 下一个排列
- 螺旋矩阵 II
- 螺旋矩阵/顺时针打印矩阵
- 顺时针旋转矩阵
- 左右两边子数组的和相等
- 使数组唯一的最小增量
- 求两数之和以及下标差之和的最大值
- 链表
- 链表理论基础试读
- 移除链表元素
- 设计链表
- 反转链表
- 重排链表
- 回文链表
- 指定区间反转链表/反转链表II
- 两两交换链表中的节点
- 两个链表的第一个重合节点
- 分隔链表
- K个一组翻转链表
- 排序的循环链表
- 哈希表理论基础
- 哈希表理论基础试读
- 第一个只出现一次的字符
- 验证外星语词典
- 有效的字母异位词
- 字母异位词分组
- 单词长度的最大乘积
- 两个数组的交集
- 多个数组求交集
- 赎金信
- 快乐数
- 两数之和
- 四数相加 II
- 最小时间差
- 缺失的第一个正数
- 最长连续序列
- 数组中重复的数字
- 【利用哈希设计高级结构】插入、删除和随机访问都是 O(1) 的容器
- 【利用哈希设计高级结构】设计 LRU 缓存结构
- 【利用哈希设计高级结构】设计 LFU 缓存结构
- 字符串
- 修改大小写
- 验证 IP 地址
- 字符串转换整数 (atoi)
- 【KMP算法】实现 strStr()
- 【KMP算法】重复的子字符串
- 栈
- 栈理论基础试读
- 从尾到头打印链表
- 用两个栈实现队列
- 有效的括号
- 删除字符串中的所有相邻重复项
- 后缀表达式
- 表达式求值
- 字符串解码
- 小行星碰撞
- 包含 min 函数的栈
- 栈的压入、弹出序列
- 【单调栈】单调栈理论基础试读
- 【单调栈】用一个栈实现另一个栈的排序
- 【单调栈】每日温度
- 【单调栈】下一个更大元素 I
- 【单调栈】下一个更大元素 II
- 【单调栈】132 模式
- 【单调栈】接雨水
- 【单调栈】柱状图中最大的矩形
- 【单调栈】矩阵中最大的矩形
- 【单调栈】移掉 K 位数字
- 队列
- 队列理论基础
- 用队列实现栈
- 滑动窗口的平均值
- 最近请求次数
- 【单调队列】单调队列理论基础
- 【单调队列】滑动窗口最大值
- 【堆】堆理论基础
- 【堆】数据流的第 K 大数值
- 【堆】数组中的第k大的数字
- 【堆】前 K 个高频元素
- 【堆】最小的 k 个数
- 【堆】和最小的 k 个数对
- 【堆】数据流中的中位数:对顶堆问题
- 二叉树
- 二叉树理论基础
- 二叉树的四种遍历方法
- 如何构造一棵二叉树
- 序列化与反序列化二叉树
- 左叶子之和
- 找树左下角的值
- 二叉树每层的最大值
- 二叉树的右侧视图
- 二叉树的锯齿形层序遍历
- 翻转二叉树
- 合并二叉树
- 二叉树剪枝
- 对称二叉树
- 另一棵树的子树
- 树的子结构
- 寻找重复的子树
- 二叉树的最大深度
- 二叉树的最小深度
- 二叉树的最大宽度
- 完全二叉树的节点个数
- 往完全二叉树添加节点
- 二叉树的完全性检验
- 平衡二叉树
- 二叉树的最近公共祖先
- 最大二叉树
- 从中序与后序遍历序列构造二叉树
- 从前序与中序遍历序列构造二叉树
- 节点之和最大的路径
- 二叉树的直径
- 【二叉搜索树】二叉搜索树中的搜索
- 【二叉搜索树】验证二叉搜索树
- 【二叉搜索树】展平二叉搜索树
- 【二叉搜索树】二叉搜索树与双向链表
- 【二叉搜索树】二叉搜索树中的中序后继
- 【二叉搜索树】二叉搜索树的最小绝对差
- 【二次搜索树】二叉搜索树迭代器
- 【二叉搜索树】二叉搜索树中两个节点之和
- 【二叉搜索树】二叉搜索树中的众数
- 【二叉搜索树】二叉搜索树的最近公共祖先
- 【二叉搜索树】二叉搜索树中的插入操作
- 【二叉搜索树】删除二叉搜索树中的节点
- 【二叉搜索树】修剪二叉搜索树
- 【二叉搜索树】将有序数组转换为二叉搜索树
- 【二叉搜索树】把二叉搜索树转换为累加树
- 【二叉搜索树】二叉搜索树的后序遍历序列
- 【二叉搜索树】搜索二维矩阵 II
- 【TreeSet/TreeMap】TreeSet 和 TreeMap 理论基础
- 【TreeSet/TreeMap】值和下标之差都在给定的范围内
- 【TreeSet/TreeMap】日程表
- 前缀树
- 前缀树理论基础
- 实现前缀树
- 替换单词
- 神奇的字典
- 最短的单词编码
- 单词之和
- 最大的异或
- 二分查找
- 二分查找理论基础
- 【标准的二分】二分查找
- 【标准的二分】查找插入位置
- 【标准的二分】寻找峰值
- 【标准的二分】x 的平方根
- 【标准的二分】找出给定方程的正整数解
- 【标准的二分】排序数组中只出现一次的数字
- 【标准的二分】二维数组中的查找
- 【标准的二分】按权重生成随机数
- 【标准的二分】狒狒吃香蕉
- 【二分查找左边界】统计有序矩阵中的负数
- 【二分查找左边界】第一个错误的版本
- 【二分查找左边界】寻找旋转排序数组中的最小值
- 【二分查找左边界】旋转数组的最小数字
- 【二分查找左边界】搜索旋转排序数组
- 【二分查找右边界】矩阵中战斗力最弱的 K 行
- 【二分查找左右边界】在排序数组中查找元素的第一个和最后一个位置
- 【二分查找极值点】山脉数组的峰顶索引
- 【二分查找极值点】找出有序数组中绝对值最小的数
- 【滑动窗口】长度最小的子数组
- 【滑动窗口】不含重复字符的最长子字符串
- 【滑动窗口】乘积小于K的子数组
- 【滑动窗口】字符串中的变位词
- 【滑动窗口】字符串中的所有变位词
- 【滑动窗口】含有所有字符的最短字符串
- 【快慢指针】环形链表
- 【快慢指针】链表中环的入口节点
- 【快慢指针】链表的中间结点
- 【快慢指针】删除链表的倒数第 N 个结点
- 【快慢指针】链表中倒数第k个节点
- 合并两个有序链表
- 合并两个有序数组
- 合并两个有序数组
- 两数相加
- 链表中的两数相加
- 字符串相加
- 大数相减
- 比较版本号
- 寻找两个正序数组的中位数
- 奇偶链表
- 替换空格
- 双指针法
- 双指针法理论基础
- 【左右指针】验证回文串
- 【左右指针】最多删除一个字符得到回文
- 【左右指针】回文子字符串的个数
- 【左右指针】反转字符串
- 【左右指针】反转字符串II
- 【左右指针】两数之和 II - 输入有序数组
- 【左右指针】反转字符串中的单词 III
- 【左右指针】翻转字符串里的单词
- 【左右指针】左旋转字符串
- 【左右指针】有序数组的平方
- 【左右指针】三数之和
- 【左右指针】四数之和
- 【左右指针】删除排序链表中的重复元素
- 【左右指针】删除排序链表中的重复元素 II
- 【左右指针】删除有序数组中的重复项
- 【左右指针】压缩字符串
- 【左右指针】移除元素
- 【左右指针】移动零
- 【左右指针】调整数组顺序使奇数位于偶数前面
- 【左右指针】最短无序连续子数组
- 【左右指针】找到 K 个最接近的元素
- 【左右指针】盛最多水的容器
- 区间求和
- 【前缀和】二维子矩阵的和
- 【前缀和】和为 k 的连续子数组的个数
- 【前缀和】0 和 1 个数相同的最长连续子数组
- 【前缀和】字母与数字个数相同的最长连续子数组
- 【前缀和】除自身以外数组的乘积
- 【差分】航班预订统计
- 排序
- 排序理论基础
- 把数组排成最小的数
- 【计数排序】数组相对排序
- 【快速排序】数组中的第 k 大的数字
- 【快速排序】最小的 k 个数
- 【归并排序】链表排序
- 【归并排序】合并 K 个升序链表
- 【归并排序】数组中的逆序对
- 回溯
- 回溯法理论基础
- 【排列树】没有重复元素集合的全排列
- 【排列树】含有重复元素集合的全排列
- 【排列树】字符串的排列
- 【子集树】含有 k 个元素的组合
- 【子集树】组合总和 III
- 【子集树】电话号码的字母组合
- 【子集树】允许重复选择元素的组合
- 【子集树】含有重复元素集合的组合
- 【子集树】生成匹配的括号
- 【子集树】分割回文串
- 【子集树】复原 IP 地址
- 【子集树】子集
- 【子集树】子集 II
- 【子集树】递增子序列
- 【子集树】N 皇后
- 【子集树】解数独
- 【树形回溯】路径总和
- 【树形回溯】二叉树的所有路径
- 【树形回溯】从根节点到叶节点的路径数字之和
- 【树形回溯】路径总和II
- 【树形回溯】向下的路径节点之和
- 贪心
- 贪心算法理论基础
- 找零
- 柠檬水找零
- 分发饼干
- K 次取反后最大化的数组和
- 加油站
- 分发糖果
- 根据身高重建队列
- 划分字母区间
- 单调递增的数字
- 监控二叉树
- 使数组变成交替数组的最少操作数
- 剪绳子 II
- 【区间调度】无重叠区间
- 【区间调度】用最少数量的箭引爆气球
- 【区间调度】合并区间
- 动态规划
- 动态规划理论基础试读
- 【Fibonacci】斐波那契数列
- 【Fibonacci】爬楼梯问题
- 【Fibonacci】使用最小花费爬楼梯
- 【Fibonacci】圆环回原点
- 【背包】背包问题理论基础
- 【背包/0-1背包】分割等和子集
- 【背包/0-1背包】加减的目标值
- 【背包/0-1背包】一和零
- 【背包/完全背包】零钱兑换II
- 【背包/完全背包】零钱兑换
- 【背包/完全背包】排列的数目
- 【背包/完全背包】完全平方数
- 【背包/完全背包】单词拆分
- 【打家劫舍】打家劫舍
- 【打家劫舍】环形打家劫舍
- 【打家劫舍】树形打家劫舍
- 【买卖股票】买卖股票的最佳时机
- 【买卖股票】买卖股票的最佳时机 II
- 【买卖股票】买卖股票的最佳时机含手续费
- 【买卖股票】最佳买卖股票时机含冷冻期
- 【买卖股票】买卖股票的最佳时机 III
- 【买卖股票】买卖股票的最佳时机 IV
- 【子串和子序列】最长斐波那契数列
- 【子串和子序列】摆动序列
- 【子串和子序列】最长递增子序列
- 【子串和子序列】最长连续递增序列
- 【子串和子序列】最大子数组和
- 【子串和子序列】最大子数组乘积
- 【子串和子序列】最长重复子数组
- 【子串和子序列】最长公共子序列
- 【子串和子序列】不相交的线
- 【子串和子序列】字符串交织
- 【子串和子序列】判断子序列
- 【子串和子序列】子序列的数目
- 【子串和子序列】两个字符串的删除操作
- 【子串和子序列】编辑距离
- 【子串和子序列】最长回文子串
- 【子串和子序列】最长回文子序列
- 【子串和子序列】最少回文分割
- 【子串和子序列】数组中的最长山脉
- 【矩阵路径】不同路径
- 【矩阵路径】不同路径 II
- 【矩阵路径】最小路径之和
- 【矩阵路径】三角形中最小路径之和
- 【矩阵路径】礼物的最大价值
- 剪绳子
- 不同的二叉搜索树
- 把数字翻译成字符串
- 粉刷房子
- 翻转字符
- 分割数组
- 最大正方形
- 统计全为 1 的正方形子矩阵
- 最长有效括号
- 正则表达式匹配
- 丑数
- 图
- 图理论基础
- 【BFS 和 DFS 模板】岛屿的最大面积
- 【DFS】岛屿数量
- 【DFS】节点间通路
- 【DFS】二分图
- 【需要存储路径的 DFS 模板】所有路径
- 【DFS + 回溯模板】单词搜索
- 【DFS】计算除法
- 【记忆化 DFS 模板】最长递增路径
- 【DFS】二叉树中所有距离为 K 的结点
- 【DFS】克隆图
- 【DFS】打印从 1 到最大的 n 位数
- 【DFS】复杂链表的复制
- 【DFS】展平多级双向链表
- 【BFS】矩阵中的距离
- 【BFS】地图分析
- 【BFS】单词演变
- 【BFS】开密码锁
- 【BFS】到家的最少跳跃次数
- 【拓扑排序模版】课程顺序
- 【拓扑排序】外星文字典
- 【拓扑排序】重建序列
- 【并查集模版】省份数量
- 【并查集】相似的字符串
- 【并查集】多余的边
- 【并查集】最长连续序列
- 数学
- 计数二进制子串
- 自动机
- 【确定有限状态自动机】表示数值的字符串
- 海量数据和空间限制
- 内存只有 2G,如何对 100 亿数据进行排序?
- 如何判断某网页的 URL 是否存在于包含 100 亿条数据的黑名单上
- 内存放不下,如何在 20 亿个整数中找到出现次数最多的数
- 如何在 40 亿个非负整数中找到所有未出现的数
- 如何在 100 亿数据中找到中位数
