leetcode 分tag
数组问题(复杂度先时间再空间,/表示或者)
-
两数之和✔ O(n), O(n)
-
三数之和 ✔ 排序+双指针 (O(n2), O(logn)/O(n))
-
四数之和✔ 排序+双指针 (O(n3), O(logn)/O(n))
-
最大子序和✔ 动态规划 (O(n), O(1))
-
接雨水✔ 双指针 (O(n), O(1))
-
盛最多水的容器✔ 双指针 (O(n), O(1))
-
最接近的三数之和✔ 排序+双指针 (O(n2), O(logn)/O(n))
-
最大矩形 ✔ 动态规划 O(n2n) O(mn)
-
删除排序数组中的重复项✔ 双指针(快慢指针) (O(n), O(1))
-
下一个排列✔ 线性扫描(O(n), O(1))
-
1比特与2比特字符 ✔ 线性扫描 (O(n), O(1))
-
翻转图像I✔ 先取反再转序 (O(M*N), O(1))
-
组合总和✔ 回溯+剪枝 (O(n2), O(logn)/O(n))
-
组合总和 II ✔ 回溯+剪枝 (O(n2), O(n))
-
全排列✔ 回溯+剪枝 (O(n * n!), O(n * n!))
-
全排列 II ✔ 回溯+剪枝 (O(n * n!), O(n * n!))
-
子集✔ 递归 O(n * 2^n) O(n * 2^n) N次方
-
子集 II✔ 递归 O(n * 2^n) O(n * 2^n) N次方
整理:对于组合/全排列/子集问题,如果不含重复数字,直接做,有重复数字就先排序,再跳过同一个数字
-
杨辉三角✔ 动态规划 O(numRows^2) O(numRows^2)
-
数组拆分 I✔ 先排序再遍历 O(nlog(n), O(1))
-
跳跃游戏✔ 贪心 (O(n), O(1))
-
跳跃游戏 II✔ 贪心 (O(n), O(1))
-
螺旋矩阵✔ 确定边界 (O(mn), O(1))
-
螺旋矩阵 II ✔ 确定边界 (O(mn), O(1))
-
螺旋矩阵 III✔ 确定边界 (O(mn), O(1))
-
买卖股票的最佳时机✔ O(n), O(1)
-
买卖股票的最佳时机 II✔ 累加数组的连续数字之间的差值:O(n), O(1)
-
买卖股票的最佳时机 III✔ O(n), O(1)
-
最佳买卖股票时机含冷冻期✔ O(n), O(1)
-
买卖股票的最佳时机含手续费✔ O(n), O(1)
-
合并两个有序数组✔ 双指针 O(m+n), O(1)
-
最小路径和 ✔ 动态规划 O(mn), O(1)
-
合并区间 ✔ 先排序再线性扫描 O(nlogn), O(logn)
-
两数之和 II - 输入有序数组✔ 双指针 O(n), O(1)
-
缺失的第一个正数✔ 交换 O(n), O(1)
-
最长重复子数组✔ 暴力解法:O(n3),O(1) 动态规划:O(NXM), O(NXM)
-
寻找重复数✔ 二分查找:O(nlogn), O(1) 快慢指针: O(n), O(1) 原地修改元素为负数 O(n), O(1)
-
按奇偶排序数组✔ 两遍扫描:O(N), O(N) 原地算法 :O(N), O(1)
-
移除元素 ✔ O(n), O(1)
-
数组中重复的数据 ✔ 原地修改元素为负数做访问标记 O(n), O(1)
-
除自身以外数组的乘积 ✔ 左右乘积列表 O(n), O(n)
-
找到所有数组中消失的数字✔ 原地修改元素为负数做访问标记 O(n), O(1)
-
使用最小花费爬楼梯✔ 动态规划 O(n), O(1)
链表
- 两数相加✔ O(max(m, n)) O(max(m, n))
- 两数相加 II✔ 栈 O(max(m, n)) O(m+n)
- 合并两个有序链表✔ O(m+n) O(1)
- 反转链表✔ 迭代 O(n),O(1) 递归 O(n), O(n)
- 反转链表 II✔ 迭代 O(n),O(1) 递归 O(n), O(n)
- 两两交换链表中的节点✔ 迭代 O(n),O(1) 递归 O(n), O(n)
- K 个一组翻转链表 ✔ O(n),O(1)
- 排序链表✔ 迭代 O(nlogn),O(1)
- 合并K个排序链表✔ 分治 O(k* n* logk), O(1)
- 删除链表中的节点✔ O(1)
- 重排链表 ✔ O(n)
- 删除链表的倒数第N个节点✔ O(n), O(n)
- 分隔链表✔
- 移除链表元素✔ 迭代 O(n),O(1)
- 有序链表转换二叉搜索树✔ 分治递归 O(nlogn),O(logn)
- 环形链表✔ 哈希表 O(n),O(n) 快慢指针 O(n),O(1)
- 环形链表 II ✔ 快慢指针 O(n),O(1)
- 删除排序链表中的重复元素✔ 迭代 O(n),O(1)
- 删除排序链表中的重复元素 II✔ 迭代 O(n),O(1)
- 回文链表✔ O(n),O(n)
- 对链表进行插入排序✔
- 链表的中间结点 ✔ O(n),O(1)
- 相交链表✔ O(m+n),O(1)
- 旋转链表 ✔ O(n),O(1)
- 分隔链表 ✔ 构建两个链表拼接 O(n),O(1)
- 将二叉搜索树转化为排序的双向链表
- 链表中的下一个更大节点
- 奇偶链表
树
-
不同的二叉搜索树✔ 动态规划 O(n2)
-
不同的二叉搜索树 II✔ 递归 O(4n/n1/2) O(4n/n1/2)
前序中序后序遍历https://leetcode-cn.com/problems/binary-tree-preorder-traversal/solution/tu-jie-er-cha-shu-de-si-chong-bian-li-by-z1m/
-
二叉树的前序遍历✔ 递归/迭代+栈 O(n) O(n)
-
二叉树的中序遍历✔ 递归/迭代+栈 O(n) O(n)
-
二叉树的后序遍历✔ 递归/迭代+栈 O(n) O(n)
-
二叉树的层次遍历✔ 队列 O(n) O(n)
-
二叉树的层次遍历 II✔ 队列 O(n) O(n)
-
从前序与中序遍历序列构造二叉树✔ 递归 O(n) O(n)
-
从中序与后序遍历序列构造二叉树✔ 递归 O(n) O(n)
-
根据前序和后序遍历构造二叉树✔ 递归 O(n) O(n)
-
序列化和反序列化二叉搜索树✔ 递归/迭代 O(n) O(n)
-
序列化二叉树✔ 递归/迭代 O(n) O(n)
-
二叉树的序列化与反序列化✔ 递归/迭代 O(n) O(n)
-
翻转二叉树✔ 递归/迭代 O(n) O(n)
-
二叉树的最大深度✔ 递归/迭代 O(n) O(n)
-
二叉树的最大宽度✔ 宽度优先遍历 O(n) O(n)
-
合并二叉树✔ 递归/迭代 O(n) O(n)
-
二叉树中的最大路径和✔ 递归 O(n) O(n)
-
路径总和✔
-
二叉搜索树的范围和✔
-
二叉树的最小深度✔ 递归(DFS):O(n) O(logn) BFS:
-
打家劫舍✔ O(n) O(1)
-
打家劫舍 II✔ O(n) O(1)
-
打家劫舍 III✔ O(n) O(1)
哈希表
- 两数之和✔
- 宝石与石头✔
- 无重复字符的最长子串 ✔ 滑动窗口 O(n) O(n)
- 最小覆盖子串✔ 滑动窗口 O(n) O(1)
- 至多包含两个不同字符的最长子串✔ 滑动窗口 O(n) O(1)
- 至多包含 K 个不同字符的最长子串✔ 滑动窗口 O(n) O(1)
- 长度最小的子数组 ✔ 滑动窗口 O(n) O(1)
- 最小区间
- 最小窗口子序列
- 最大矩形✔
- 解数独
- 只出现一次的数字✔
- 两个数组的交集✔
- 每日温度✔
- 岛屿的周长✔
- 快乐数
- 串联所有单词的子串✔
- 键盘行
- 最长重复子数组✔
- 回旋镖的数量
- 子域名访问计数
- 重复的DNA序列
- 字母异位词分组
- 和为K的子数组✔
- 最小覆盖子串✔
- 复制带随机指针的链表
- 原子的数量
- 员工的重要性
- 不同岛屿的数量 II
- 最长回文串
- 连续数组
- 计数质数
- 不同岛屿的数量
- 前 K 个高频元素
- 找不同
- 猜数字游戏
- 最长和谐子序列
- 查找常用字符
- 存在重复元素
- 最长重复子串
- 有效的数独
-
分糖果
- 单词规律
- 最短完整词
动态规划
-
斐波那契数✔ O(n) O(n)
-
零钱兑换✔ O(sn) O(s) s:金额 n:面值个数
-
最长回文子序列
-
最大子序和 ✔ O(n^2), O(n)
-
最长上升子序列 ✔ O(n^2), O(n)
最大子序列和与最长上升子序列的dp数组定义是以 nums[i]为结尾的最大子数组和/最长递增子序列为 dp[i]
-
最长公共子序列 ✔ O(mn), O(mn)
-
最大矩形 ✔
深度优先搜索
- 24 点游戏
- 祖玛游戏
- 二叉树的最大深度
- 将有序数组转换为二叉搜索树
- 破解保险箱
- 网络延迟时间
- 孤独像素 II
- 二叉树展开为链表
- 字符串解码
- 01 矩阵
- 对称二叉树
- 从前序与中序遍历序列构造二叉树
- 有序链表转换二叉搜索树
- 大礼包
- 奇怪的打印机
- 二叉树的所有路径
- 二叉树的右视图
- 二叉树中的最大路径和
- 路径总和✔
- 岛屿的最大面积✔
- 克隆图
- 隔离病毒
- 岛屿数量
- 相同的树
- 移除盒子
- 删除无效的括号
- 员工的重要性
- 金字塔转换矩阵
- 打家劫舍 III
- 二叉树的最小深度
- N叉树的最大深度
- 不同岛屿的数量 II
- 课程表
- 由斜杠划分区域
- 恢复二叉搜索树
- 递增子序列
- 树中距离之和
- 矩阵中的最长递增路径✔ O(mn) O(mn)
- 三元表达式解析器
- 不同岛屿的数量
- 喧闹和富有
- 被围绕的区域
二分查找
- 寻找两个有序数组的中位数
- 两个数组的交集
- 矩形区域不超过 K 的最大数值和
- 两数之和 II - 输入有序数组
- 寻找重复数
- 最长重复子数组
- 和至少为 K 的最短子数组
- 最长上升子序列
- 搜索旋转排序数组
- 地下城游戏
- Pow(x, n)
- 两数相除
- x 的平方根
- 搜索插入位置
- 山脉数组的峰顶索引
- 区间和的个数
- 有序矩阵中第K小的元素
- 乘法表中第k小的数
- 完全二叉树的节点个数
- 分割数组的最大值
- 长度最小的子数组
- 翻转对
- 寻找旋转排序数组中的最小值
- 猜数字大小
- 计算右侧小于当前元素的个数
- 在排序数组中查找元素的第一个和最后一个位置✔ O(n), O(1)
- 供暖器
- 最长重复子串
- 第 K 个最小的素数分数
- 判断子序列
- 将数据流变为多个不相交区间
- 黑名单中的随机数
- 四数相加 II
- 寻找右区间
- 最小好进制
- 阶乘函数后K个零
- 俄罗斯套娃信封问题
- 搜索旋转排序数组 II
- 排列硬币
- 找出第 k 小的距离对
- 最小化去加油站的最大距离
- 寻找峰值
贪心
- 根据身高重建队列
- 跳跃游戏 II
- 情侣牵手
- 分发糖果
- 去除重复字母
- 买卖股票的最佳时机 II
- 重构字符串
- 任务调度器
- 拼接最大数
- 跳跃游戏
- 划分字母区间
- 翻转矩阵后的得分
- 两地调度
- 分发饼干
- 最后一块石头的重量
- 模拟行走机器人
- 删列造序
- 将数组拆分成斐波那契序列
- 加油站
- 买卖股票的最佳时机含手续费
- 判断子序列
- 通配符匹配
- 课程表 III
- IPO
- 分割数组为连续子序列
- 按要求补齐数组
- K 连续位的最小翻转次数
- 用最少数量的箭引爆气球
- K 距离间隔重排字符串
- 形成字符串的最短路径
- 设置交集大小至少为2
- 4键键盘
- 摆动序列
- 移掉K位数字
- 戳印序列
- 柠檬水找零
- 无重叠区间
- Dota2 参议院
- 优势洗牌
- 寻找排列
- 单调递增的数字
- 救生艇
双指针
- 无重复字符的最长子串
- 三数之和
- 接雨水
- 盛最多水的容器
- 最接近的三数之和
- 删除排序数组中的重复项
- 四数之和
- 合并两个有序数组
- 两个数组的交集
- 删除链表的倒数第N个节点
- 分隔链表
- 串联所有单词的子串
- 两数之和 II - 输入有序数组
- 寻找重复数
- 移除元素
- 最小区间
- 实现 strStr()
- 环形链表
- 反转字符串
- 颜色分类
- 有序数组的平方
- 最小覆盖子串
- 移动零
- 回文链表
- 划分字母区间
- 替换后的最长重复字符
- 长度最小的子数组
- 反转字符串中的元音字母
- 旋转链表
- 环形链表 II
- 独特字符串
- 验证回文串
- 乘积小于K的子数组
- 环形数组循环
- 两个数组的交集 II
- 删除排序数组中的重复项 II
- 数组中的最长山脉
- 安排工作以达到最大收益
- 比较含退格的字符串
- 推多米诺
- 最大连续1的个数 III
- 通过删除字母匹配到字典里最长单词
广度优先搜索
- 公交路线
- 二叉树的层次遍历 II
- 网络延迟时间
- 接雨水 II
- 01 矩阵
- 对称二叉树
- 滑动谜题
- 访问所有节点的最短路径
- 二叉树的右视图
- 二叉树的层次遍历
- 完全平方数
- 克隆图
- 岛屿数量
- 删除无效的括号
- 员工的重要性
- 二叉树的最小深度
- N叉树的最大深度
- 课程表
- 腐烂的橘子
- 相似度为 K 的字符串
- 被围绕的区域
- 在每个树行中找最大值
- 找树左下角的值
- 扫雷游戏
- 二叉树的锯齿形层次遍历
- 单词接龙
- N叉树的层序遍历
- 迷宫
- 最小高度树
- 太平洋大西洋水流问题
- 单词接龙 II
- 猫和老鼠
- 二叉树中所有距离为 K 的结点
- 离建筑物最近的距离
- 逃离大迷宫
- 获取所有钥匙的最短路径
- 以图判树
- 最短的桥
- 课程表 II
- 为高尔夫比赛砍树
- K 站中转内最便宜的航班
- 二叉树的堂兄弟节点
栈
- 接雨水
- 最大矩形
- 有效的括号
- 二叉树的中序遍历
- 用队列实现栈
- 每日温度
- 去除重复字母
- 字符串解码
- 删除最外层的括号
- 下一个更大元素 I
- 基本计算器
- 最小栈
- 二叉树的前序遍历
- 简化路径
- 用栈实现队列
- 原子的数量
- 二叉搜索树迭代器
- 棒球比赛
- 柱状图中最大的矩形
- 下一个更大元素 II
- 二叉树的后序遍历
- 三元表达式解析器
- 括号的分数
- 132模式
- 扁平化嵌套列表迭代器
- 二叉树的锯齿形层次遍历
- 函数的独占时间
- 迷你语法分析器
- 链表中的下一个更大节点
- 基本计算器 IV
- 验证前序遍历序列二叉搜索树
- 比较含退格的字符串
- 验证栈序列
- 移掉K位数字
- 奇偶跳
- 验证二叉树的前序序列化
- 行星碰撞
- 最大频率栈
- 标签验证器
- 删除字符串中的所有相邻重复项
- 股票价格跨度
- 子数组的最小值之和
排序
- 排序链表
- 两个数组的交集
- 合并区间
- 最大数
- 摆动排序
- 重构字符串
- 颜色分类
- 最大间距
- 区间和的个数
- 对链表进行插入排序
- 插入区间
- 按奇偶排序数组 II
- 最佳的碰头地点
- 翻转对
- 计算右侧小于当前元素的个数
- 存在重复元素 III
- 数组的相对排序
- 煎饼排序
- 黑名单中的随机数
- H指数
- 有效的字母异位词
- 摆动排序 II
- 两个数组的交集 II
- 单词缩写
- 车队
- 三角形的最大周长
- 通过删除字母匹配到字典里最长单词
- 最接近原点的 K 个点
- 距离顺序排列矩阵单元格
- 距离相等的条形码
- 会议室 II
- 校园自行车分配
- 会议室
- 前五科的均分
- 用户网站访问行为分析
堆
- 合并K个排序链表
- 赛车
- 网络延迟时间
- 接雨水 II
- 丑数 II
- 重构字符串
- 数组中的第K个最大元素
- 超级丑数
- 有序矩阵中第K小的元素
- 天际线问题
- 前 K 个高频元素
- 最后一块石头的重量
- 最低加油次数
- 第 K 个最小的素数分数
- 数据流中的第K大元素
- 找出第 k 小的距离对
- IPO
- 分割数组为连续子序列
- K 距离间隔重排字符串
- 滑动窗口最大值
- 水位上升的泳池中游泳
- 设计推特
- 数据流的中位数
- 根据字符出现频率排序
- 前K个高频单词
- 获取所有钥匙的最短路径
- 查找和最小的K对数字
- 雇佣 K 名工人的最低成本
- K 站中转内最便宜的航班
- 最接近原点的 K 个点
- 细分图中的可到达结点
- 距离相等的条形码
- 会议室 II
- 员工空闲时间
图
- 情侣牵手
- 网络延迟时间
- 除法求值
- 克隆图
- 课程表
- 由斜杠划分区域
- 相似度为 K 的字符串
- 相似字符串组
- 最小高度树
- 不邻接植花
- 重新安排行程
- 冗余连接
- 钥匙和房间
- 正方形数组的数目
- 序列重建
- 冗余连接 II
- 以图判树
- 课程表 II
- 火星词典
- 尽量减少恶意软件的传播 II
- 分隔数组以得到最大和
- 找到最终的安全状态
- 找到小镇的法官
- 判断二分图
- 无向图中连通分量的数目
- 等式方程的可满足性
- 得分最高的路径
- 从始点到终点的所有路径
- 最低成本联通所有城市
- 平行课程
- 最大层内元素和
- 地图分析
- 字符串转化
分治算法
- 寻找两个有序数组的中位数
- 最大子序和
- 合并K个排序链表
- 戳气球
- 求众数
- 为运算表达式设计优先级
- 漂亮数组
- 数组中的第K个最大元素
- 区间和的个数
- 给表达式添加运算符
- 翻转对
- 天际线问题
- 计算右侧小于当前元素的个数
- 将二叉搜索树转化为排序的双向链表
- DI 序列的有效排列
- 自由之路
- 搜索二维矩阵 II
滑动窗口
- 无重复字符的最长子串
- 最小覆盖子串
- 滑动窗口中位数
- 替换后的最长重复字符
- K 连续位的最小翻转次数
- 滑动窗口最大值
- 最小窗口子序列
- 最大连续1的个数 III
- K 个不同整数的子数组
- 移动石子直到连续 II】
- 字符串的排列
- 至多包含 K 个不同字符的最长子串
- 最长湍流子数组
- 爱生气的书店老板
- 元素和为目标值的子矩阵数量
- 至多包含两个不同字符的最长子串
- 长度为 K 的无重复字符子串
- 最少交换次数来组合所有的 1
字典树
- 数组中两个数的最大异或值
- 实现 Trie (前缀树)
- 前缀和后缀搜索
- 添加与搜索单词 - 数据结构设计
- 词典中最长的单词
- 键值映射
- 单词替换
- 单词搜索 II
- 单词方块
- 实现一个魔法字典
- 回文对
- 前K个高频单词
- 字符流
- 连接词
- 字符串的索引对
- 驼峰式匹配
- 设计搜索自动补全系统
递归
- 特殊的二进制序列
- 划分为k个相等的子集
- 最长同值路径
- 二叉搜索树的范围和
- 原子的数量
- 所有可能的满二叉树
- 二叉搜索树结点最小距离
- 有效的井字游戏
- 中心对称数 II
- 输出比赛匹配对
- 第K个语法符号
- 最小因式分解
- 中心对称数 III
- 拆分二叉搜索树