- 数据类型默认值
- 程序标识符
- 数组的内容与哈希码
- 原生LinkedList方法
- Math库诡异特性
- StreamAPI语法
- 对比String的内容、地址与哈希码
- 实现二叉树
- 实现并查集
- 实现图结构
- 实现线性表
- 实现优先队列
- 实现红黑树
- 实现排序
- 实现符号表
- 189. 轮转数组
- 思路: 辅助数组 或 三次反转
- 代码: LeetCode189.java
- 204. 计数质数
- 思路: 埃拉托斯特尼筛法
- 代码: LeetCode204.java
- 238. 除自身以外数组的乘积
- 代码: LeetCode238.java
- 268. 丢失的数字
- 代码: LeetCode268.java
- 287. 寻找重复数
- 代码: LeetCode287.java
- 1013. 将数组分成和相等的三个部分
- 思路: 直接按照累加和找分割点,并判断分割点的索引是否合理
- 代码: LeetCode1013.java
- 1431. 拥有最多糖果的孩子
- 蓝桥97. k倍区间
- 思路: 两个序列模K余数相同则差模K为0
- 代码: LanQiao97.java
- 118. 杨辉三角
- 代码: LeetCode118.java
- 258. 各位相加
- 代码: LeetCode258.java
- 1137. 第 N 个泰波那契数
- 思路: 迭代t0, t1, t2
- 代码: LeetCode1137.java
- 11. 盛最多水的容器
- 思路: 双指针 + 贪心
- 代码: LeetCode11.java
- 45. 跳跃游戏 II
- 思路: 不需要DP,维护最远可以到达的位置以及每个步数可以到达的位置
- 代码: LeetCode45.java
- 55. 跳跃游戏
- 思路: 不需要DP,直接使用贪心算法更新最远位置
- 代码: LeetCode55.java
- 334. 递增的三元子序列
- 思路: 贪心算法(非常tricky) 或 双向遍历找最值
- 代码: LeetCode334.java
- 435. 无重叠区间
- 思路: 排序后用贪心算法更新右边界来查找不冲突的区间
- 代码: LeetCode435.java
- 605. 种花问题
- 思路: 找到连续的0,累计可种数
- 代码: LeetCode605.java
- 763. 划分字母区间
- 思路: 本质是合并区间问题,推荐只记录每个字母的右边界,再从左到右生成区间
- 代码: LeetCode763.java
- 1642. 可以到达的最远建筑
- 思路: 全梯子逐渐换砖头/全砖头逐渐换梯子
- 代码: LeetCode1642.java
- 9. 回文数
- 思路: 双指针 或 递归
- 代码: LeetCode9.java
- 15. 三数之和
- 思路: 排序 + 双指针【注意去重】
- 代码: LeetCode15.java
- 16. 最接近的三数之和
- 思路: 两层枚举+二分查找 -> 一层枚举+双指针
- 代码: LeetCode16.java
- 26. 删除有序数组中的重复项
- 思路: LinkedHashSet 或 快慢指针
- 代码: LeetCode26.java
- 27. 移除元素
- 思路: 快慢指针 或 反向指针【避免重复赋值】
- 代码: LeetCode27.java
- 76. 最小覆盖子串
- 思路: 同向双指针,满足条件左指针右移动,不满足右指针右移
- 代码: LeetCode76.java
- 80. 删除有序数组中的重复项 II
- 思路: 快慢指针
- 代码: LeetCode80.java
- 88. 合并两个有序数组
- 代码: LeetCode88.java
- 141. 环形链表
- 思路: 快慢指针 或 哈希表
- 代码: LeetCode141.java
- 142. 环形链表 II
- 思路: 快慢指针 或 哈希表
- 代码: LeetCode142.java
- 283. 移动零
- 代码: LeetCode283.java
- 344. 反转字符串
- 代码: LeetCode344.java
- 392. 判断子序列
- 代码: LeetCode392.java
- 905. 按奇偶排序数组
- 代码: LeetCode905.java
- 1470. 重新排列数组
- 1768. 交替合并字符串
- 思路: 双指针 + StringBuilder【char[]效率会更高些】
- 代码: LeetCode1768.java
- 2007. 从双倍数组中还原原数组
- 思路: left指向原值,right指向二倍值
- 代码: LeetCode2007.java
- 2122. 还原原数组
- 思路: 针对可能的k,依次用双指针法找到对应的元素【2007的进阶版】
- 代码: LeetCode2122.java
- 2130. 链表最大孪生和
- 思路: 先用快慢指针找到分界点,再反转后半部分,最后使用双指针求最大和
- 代码: LeetCode2130.java
- 1. 两数之和
- 代码: LeetCode1.java
- 3. 无重复字符的最长子串
- 思路: 遇到重复元素则滑动窗口
- 代码: LeetCode3.java
- 219. 存在重复元素 II
- 思路: 构造长度为k的滑动窗口
- 代码: LeetCode219.java
- 438. 找到字符串中所有字母异位词
- 思路: 滑动窗口记录各字符存在的数量【数组更方便】
- 代码: LeetCode438.java
- 643. 子数组最大平均数 I
- 代码: LeetCode643.java
- 1004. 最大连续1的个数 III
- 1456. 定长子串中元音的最大数目
- 1493. 删掉一个元素以后全为 1 的最长子数组
- 思路: 简化版的LeetCode1004
- 代码: LeetCode1493.java
- 33. 搜索旋转排序数组
- 思路: 两次二分,先找最小的元素/分割点,再从某一区间中查找target
- 代码: LeetCode33.java
- 34. 在排序数组中查找元素的第一个和最后一个位置
- 思路: 两次二分查找
- 代码: LeetCode34.java
- 35. 搜索插入位置
- 代码: LeetCode35.java
- 50. Pow(x, n)
- 思路: 分而治之(注意边界问题)
- 代码: LeetCode50.java
- 69. x 的平方根
- 思路: 二分查找、数学公式替换、牛顿法
- 代码: LeetCode69.java
- 74. 搜索二维矩阵
- 思路: 一次整体二分查找 或 先对行再对列做二分查找
- 代码: LeetCode74.java
- 153. 寻找旋转排序数组中的最小值
- 思路: 可以看作是LeetCode33的部分问题
- 代码: LeetCode153.java
- 374. 猜数字大小
- 思路: 要小心l + r越界
- 代码: LeetCode374.java
- 475. 供暖器
- 思路: 排序 + 二分查找
- 代码: LeetCode475.java
- 704. 二分查找
- 代码: LeetCode704.java
- 852. 山脉数组的峰顶索引
- 代码: LeetCode852.java
- 875. 爱吃香蕉的珂珂
- 代码: LeetCode875.java
- 1011.在D天内送达包裹的能力
- 思路: 先构造一个判别能否运送完成的函数,再确定二分的上下界,最后进行二分查找
- 代码: LeetCode1011.java
- 4. 寻找两个正序数组的中位数
- 思路: 双指针 或 二分查找
- 代码: LeetCode4.java
- 31. 下一个排列
- 代码: LeetCode31.java
- 41. 缺失的第一个正数
- 思路: 最佳解法是indexing sort的变体
- 代码: LeetCode41.java
- 49. 字母异位词分组
- 代码: 推荐先对元素内部排序【使用统计数量这一直观方式反而效率不高】
- 代码: LeetCode49.java
- 56. 合并区间
- 思路: 排序 + 双指针
- 代码: LeetCode56.java
- 75. 颜色分类
- 代码: LeetCode75.java
- 147. 对链表进行插入排序
- 代码: LeetCode147.java
- 148. 排序链表
- 思路: 归并排序(Top Down空间复杂度高一些,但编写比Bottom Up简单)
- 代码: LeetCode148.java
- 164. 最大间距
- 思路: 推荐使用基数排序【内置sort也能通过】
- 代码: LeetCode164.java
- 179. 最大数
- 思路: 修改基于比较的Comparator定义
- 代码: LeetCode179.java
- 242. 有效的字母异位词
- 代码: LeetCode242.java
- 274. H 指数
- 思路: 选择排序并在适当时终止 或 对h值二分查找
- 代码: LeetCode274.java
- 280. 摆动排序
- 思路: 排序后实现交替 或 贪心算法(直接交换元素)
- 代码: LeetCode280.java
- 324. 摆动排序 II
- 思路: 可以通过让中间的点出现在边上,来避免相等的值靠近
- 代码: LeetCode324.java
- 349. 两个数组的交集
- 代码: LeetCode349.java
- 350. 两个数组的交集 II
- 思路: 比349多记录一个重复数
- 代码: LeetCode350.java
- 414. 第三大的数
- 思路: HashSet+PQ 或 TreeSet
- 代码: LeetCode414.java
- 455. 分发饼干
- 代码: LeetCode455.java
- 502. IPO
- 思路: 最好采用两种思路的排序【查询最优元素 + 整体排序】
- 代码: LeetCode502.java
- 506. 相对名次
- 代码: LeetCode506.java
- 561. 数组拆分
- 代码: LeetCode561.java
- 594. 最长和谐子序列
- 思路: 哈希表+记数 或 排序+滑动窗口
- 代码: LeetCode594.java
- 628. 三个数的最大乘积
- 思路: 实际上只是比较两个可能的值
- 代码: LeetCode628.java
- 645. 错误的集合
- 代码: LeetCode645.java
- 747. 至少是其他数字两倍的最大数
- 代码: LeetCode747.java
- 888. 公平的糖果交换
- 代码: LeetCode888.java
- 912. 排序数组
- 思路: 基本的排序练习
- 代码: LeetCode912.java
- 922. 按奇偶排序数组 II
- 代码: LeetCode922.java
- 976. 三角形的最大周长
- 代码: LeetCode976.java
- 977. 有序数组的平方
- 代码: LeetCode977.java
- 1005. K 次取反后最大化的数组和
- 1030. 距离顺序排列矩阵单元格
- 思路: BFS 或 桶排序
- 代码: LeetCode1030.java
- 1051. 高度检查器
- 1122. 数组的相对排序
- 思路: 自定义排序 或 计数排序【观察到数值范围较小】
- 代码: LeetCode1122.java
- 1200. 最小绝对差
- 1235. 规划兼职工作
- 思路: 类似LeetCode2008,但是数据范围变化,需要使用另一个dp角度
- 代码: LeetCode1235.java
- 1331. 数组序号转换
- 1337. 矩阵中战斗力最弱的 K 行
- 1346. 检查整数及其两倍数是否存在
- 1356. 根据数字二进制下 1 的数目排序
- 1365. 有多少小于当前数字的数字
- 1385. 两个数组间的距离值
- 1403. 非递增顺序的最小子序列
- 1460. 通过翻转子数组使两个数组相等
- 思路: 先排序后对比 或 哈希表统计元素
- 代码: LeetCode1460.java
- 1464. 数组中两元素的最大乘积
- 1465. 切割后面积最大的蛋糕
- 1619. 删除某些元素后的数组均值
- 1637. 两点之间不包含任何点的最宽垂直区域
- 1710. 卡车上的最大单元数
- 2008. 出租车的最大盈利
- 思路: 类似2830,但需要注意边界条件
- 代码: LeetCode2008.java
- 2054. 两个最好的不重叠活动
- 思路: 关键在于形成一个类似滑动窗口的结构来降低复杂度
- 代码: LeetCode2054.java
- 2830. 销售利润最大化
- 思路: 按照end动态规划【对于end的初始位置,可以排序,也可以空间换时间】
- 代码: LeetCode2830.java
- 3010. 将数组分成最小总代价的子数组 I
- 48. 旋转图像
- 思路: 先转置后翻转 或 分四区轮转赋值 或 逐层轮转赋值
- 代码: LeetCode48.java
- 54. 螺旋矩阵
- 思路: 分层处理(推荐) 或 分边处理
- 代码: LeetCode54.java
- 73. 矩阵置零
- 思路: 用第一行与第一列标记除了他们自身所有行和列是否有0元素,再用两个变量记录第一行和第一列的情况
- 代码: LeetCode73.java
- 240. 搜索二维矩阵 II
- 思路:
- 逐行做二分查找,小于i行的j元素代表下一行可以只搜索0-(j-1)
- 矩阵化的二分(通过递归)
- 从右上角搜索,将矩阵看成二叉查找树
- 代码: LeetCode240.java
- 思路:
- 724. 寻找数组的中心下标
- 代码: LeetCode724.java
- 1732. 找到最高海拔
- 28. 找出字符串中第一个匹配项的下标
- 思路: KMP算法,核心是找到最大相等前缀后缀长度
- 代码: LeetCode28.java
- 67. 二进制求和
- 代码: LeetCode67.java
- 93. 复原 IP 地址
- 代码: LeetCode93.java
- 151. 反转字符串中的单词
- 思路: 反转 + StringBuilder 或 原生split + StringBuilder
- 代码: LeetCode151.java
- 165. 比较版本号
- 代码: LeetCode165.java
- 168. Excel表列名称
- 代码: LeetCode168.java
- 345. 反转字符串中的元音字母
- 代码: LeetCode345.java
- 1071. 字符串的最大公因子
- 思路: GCD + substring
- 代码: LeetCode1071.java
- 1422. 分割字符串的最大得分
- 1657. 确定两个字符串是否接近
- 思路: 需要满足 前后字母的种类不变 但 数量可以交换 且 位置无所谓
- 代码: LeetCode1657.java
- 蓝桥504. 单词分析
- 代码: LanQiao504
- 2. 两数相加
- 代码: LeetCode2.java
- 19. 删除链表的倒数第 N 个结点
- 思路: 快慢指针(要注意边界情况)
- 代码: LeetCode19.java
- 21. 合并两个有序链表
- 思路: 多指针迭代或递归
- 代码: LeetCode21.java
- 24. 两两交换链表中的节点
- 代码: LeetCode24.java
- 25. K 个一组翻转链表
- 思路: 先分段后翻转再拼接 或 分段时直接翻转并借助dummyNode获取最后的head
- 代码: LeetCode25.java
- 83. 删除排序链表中的重复元素
- 代码: LeetCode83.java
- 92. 反转链表 II
- 思路: 引入DummyNode解决特殊情况
- 代码: LeetCode92.java
- 138. 随机链表的复制
- 代码: LeetCode138.java
- 146. LRU 缓存
- 思路: 继承原生LinkedHashMap 或 HashMap+双向链表
- 代码: LeetCode146.java
- 160. 相交链表
- 思路: HashMap记录前后节点 或 双指针遍历两遍
- 代码: LeetCode160.java
- 206. 反转链表
- 思路: 递归思路下,注意需要保证返回值为末端元素
- 代码: LeetCode206.java
- 234. 回文链表
- 代码: LeetCode234.java
- 237. 删除链表中的节点
- 代码: LeetCode237.java
- 328. 奇偶链表
- 思路: 用两个dummyNode辅助,先拆分再合并
- 代码: LeetCode328.java
- 876. 链表的中间结点
- 思路: 快慢指针
- 代码: LeetCode876.java
- 1836. 从未排序的链表中移除重复元素
- 思路: 确定重复的时候就要删除
- 代码: LeetCode1836.java
- 2095. 删除链表的中间节点
- 思路: 快慢指针【要仔细考虑dummyNode加还是不加,以及循环条件判断是什么】
- 代码: LeetCode2095.java
- 20. 有效的括号
- 代码: LeetCode20.java
- 71. 简化路径
- 代码: LeetCode71.java
- 84. 柱状图中最大的矩形
- 思路: 从中心(确定高度)向两边扩散(确定宽度) -> 通过递增栈来确定
- 代码: LeetCode84.java
- 150. 逆波兰表达式求值
- 代码: LeetCode150.java
- 155. 最小栈
- 代码: LeetCode155.java
- 225. 用队列实现栈
- 代码: LeetCode225.java
- 232. 用栈实现队列
- 代码: LeetCode232.java
- 394. 字符串解码
- 思路: 关键在于乘数的解析
- 代码: LeetCode394.java
- 649. Dota2 参议院
- 思路: 用两个队列分别存储两个势力【将遍历到的元素+N插回,而不是插入原值】
- 代码: LeetCode649.java
- 735. 小行星碰撞
- 思路: 由于当前的行星是否碎需要考虑前一个行星,可以想到用栈来解【注意只有相向才会碰撞】
- 代码: LeetCode735.java
- 739. 每日温度
- 思路: 递减栈【存储中间结果以降低时间复杂度】
- 代码: LeetCode739.java
- 901. 股票价格跨度
- 思路: 递减栈,存储三元组(索引、价格、该价格对应的返回值)
- 代码: LeetCode901.java
- 933. 最近的请求次数
- 代码: LeetCode933.java
- 1047. 删除字符串中的所有相邻重复项
- 2390. 从字符串中移除星号
- 思路: 明显看出后进先出关系,想到使用栈【可以直接操作StringBuilder而不用单独创建栈】
- 代码: LeetCode2390.java
- 128. 最长连续序列
- 代码: LeetCode128.java
- 136. 只出现一次的数字
- 思路: HashSet不断增删,维持常数复杂度 或 位异或
- 代码: LeetCode136.java
- 169. 多数元素
- 思路: 摩尔投票法 或 哈希表计数
- 代码: LeetCode169.java
- 217. 存在重复元素
- 思路: 遍历元素存入HashSet 或 先排序后遍历
- 代码: LeetCode217.java
- 229. 多数元素 II
- 思路: 类似LeetCode169
- 代码: LeetCode229.java
- 389. 找不同
- 思路: 可以用哈希表记录,但推荐开销更小的数组
- 代码: LeetCode389.java
- 560. 和为 K 的子数组
- 思路: 子数组的sum = sum(0-y) - sum(0-x)
- 代码: LeetCode560.java
- 706. 设计哈希映射
- 代码: LeetCode706.java
- 1002. 查找共用字符
- 思路: 用 哈希表/小写字母数组 统计字符
- 代码: LeetCode1002.java
- 1207. 独一无二的出现次数
- 1512. 好数对的数目
- 1679. K 和数对的最大数目
- 1941. 检查是否所有字符出现次数相同
- 2215. 找出两数组的不同
- 23. 合并 K 个升序链表
- 代码: LeetCode23.java
- 215. 数组中的第K个最大元素
- 思路: 快速排序(不考虑前K个元素顺序) | 原地maxHeap | 长度为k的maxHeap
- 代码: LeetCode215.java
- 239. 滑动窗口最大值
- 思路: 一般用不到手写索引优先队列,而是考虑存取(value, index)【窗口长度为k,不代表堆长为k】
- 代码: LeetCode239.java
- 295. 数据流的中位数
- 思路: 将数据分别插入较低和较高的两个优先队列
- 代码: LeetCode295.java
- 347. 前 K 个高频元素
- 代码: LeetCode347.java
- 373. 查找和最小的 K 对数字
- 代码: LeetCode373.java
- 378. 有序矩阵中第 K 小的元素
- 思路: 堆(只利用每行递增与"第K个") | BestFirstSearch+堆(需要注意查重以及堆的长度)
- 代码: LeetCode378.java
- 703. 数据流中的第 K 大元素
- 代码: LeetCode703.java
- 857. 雇佣 K 名工人的最低成本
- 思路: 看到K就想到PQ,再看到两个属性,就能想到是排序+PQ
- 代码: LeetCode857.java
- 2583. 二叉树中的第 K 大层和
- 思路: 堆【需要注意数据类型,避免溢出】
- 代码: LeetCode2583.java
- 39. 组合总和
- 思路: 转换为状态树(按每个字母分层) -> DFS + 回溯
- 代码: LeetCode39.java
- 94. 二叉树的中序遍历
- 代码: LeetCode94.java
- 98. 验证二叉搜索树
- 代码: LeetCode98.java
- 100. 相同的树
- 思路: DFS角度实现起来更方便
- 代码: LeetCode100.java
- 101. 对称二叉树
- 思路: 递归选择left和right
- 代码: LeetCode101.java
- 102. 二叉树的层序遍历
- 思路: 用BFS实现
- 代码: LeetCode102.java
- 104. 二叉树的最大深度
- 代码: LeetCode104.java
- 105. 从前序与中序遍历序列构造二叉树
- 思路: 根据中序遍历确定左右子树,根据前序遍历确定根节点
- 代码: LeetCode105.java
- 106. 从中序与后序遍历序列构造二叉树
- 思路: 类似LeetCode106
- 代码: LeetCode106.java
- 108. 将有序数组转换为二叉搜索树
- 代码: LeetCode108.java
- 112. 路径总和
- 思路: DFS角度,在没有左右节点时确定是否满足条件
- 代码: LeetCode112.java
- 124. 二叉树中的最大路径和
- 代码: LeetCode124.java
- 129. 求根节点到叶节点数字之和
- 代码: LeetCode129.java
- 144. 二叉树的前序遍历
- 代码: LeetCode144.java
- 145. 二叉树的后序遍历
- 代码: LeetCode145.java
- 199. 二叉树的右视图
- 思路: 访问每一层最右边的节点(层序遍历)
- 代码: LeetCode199.java
- 208. 实现 Trie (前缀树)
- 思路: 生成一个字典树
- 代码: LeetCode208.java
- 226. 翻转二叉树
- 代码: LeetCode226.java
- 230. 二叉搜索树中第K小的元素
- 思路: 中序遍历,到第k个时结束
- 代码: LeetCode230.java
- 235. 二叉搜索树的最近公共祖先
- 思路: 通过值定位祖先的位置
- 代码: LeetCode235.java
- 236. 二叉树的最近公共祖先
- 思路: DFS返回是否包含两个点的boolean[] 或 找寻两个点并记录路径用来对比
- 代码: LeetCode236.java
- 437. 路径总和 III
- 思路: 两重DFS,一层用于遍历root,一层用于寻找target 或 前缀和+回溯(注意把{0:1}提前放入)
- 代码: LeetCode437.java
- 450. 删除二叉搜索树中的节点
- 思路: 考虑被删除节点的位置和被删除节点是否有左右子树
- 代码: LeetCode450.java
- 543. 二叉树的直径
- 思路: DFS + 记忆最大值
- 代码: LeetCode543.java
- 889. 根据前序和后序遍历构造二叉树
- 代码: LeetCode889.java
- 938. 二叉搜索树的范围和
- 代码: LeetCode938.java
- 1123. 最深叶节点的最近公共祖先
- 思路: 深度优先遍历(处理好子树高度、节点深度的关系)
- 代码: LeetCode1123.java
- 2476. 二叉搜索树最近节点查询
- 思路: 要注意二叉查找树并不能真的二分查找,需要考虑极端情况
- 代码: LeetCode2476.java
- 79. 单词搜索
- 思路: 二维图的DFS + 回溯
- 代码: LeetCode79.java
- 126. 单词接龙 II
- 思路: 按照要求先构图,用started跟ended降低复杂度
- 代码: LeetCode127.java
- 127. 单词接龙
- 思路: 按照要求先构图,用visited降低复杂度
- 代码: LeetCode127.java
- 133. 克隆图
- 思路: 深度优先比广度优先更易理解【每次返回新节点,用一个map记录新旧节点关系】
- 代码: LeetCode133.java
- 200. 岛屿数量
- 代码: LeetCode200.java
- 207. 课程表
- 思路: 问题转化为有向环检测【DFS 或 BFS】
- 代码: LeetCode207.java
- 210. 课程表 II
- 思路: 问题转化为拓扑排序(要注意有向环检测)【DFS 或 BFS】
- 代码: LeetCode210.java
- 332. 重新安排行程
- 思路: 针对边的post-order traversal(边的深度优先搜索)
- 代码: LeetCode332.java
- 399. 除法求值
- 思路: 按照除法顺序构建连边,后DFS+回溯寻找路径
- 代码: LeetCode399.java
- 542. 01 矩阵
- 思路:
- 直接思维: 对于每一个1,利用BFS找他最近的0[O(mn*mn)]
- 逆向思维: 对于所有的0,利用BFS填充到每一个1的距离[O(mn)]
- 代码: LeetCode542.java
- 思路:
- 743. 网络延迟时间
- 思路: 求的是从点k开始的最短路径的最大值
- 代码: LeetCode743.java
- 787. K 站中转内最便宜的航班
- 思路: Dijstra变体,注意剪枝方式 或 bellman-ford k次松弛(可用滚动数组优化)
- 代码: LeetCode787.java
- 841. 钥匙和房间
- 代码: LeetCode841.java
- 994. 腐烂的橘子
- 代码: LeetCode994.java
- 蓝桥89. 路径之谜
- 代码: LanQiao89
- 547. 省份数量
- 代码: LeetCode547.java
- 1584. 连接所有点的最小费用
- 思路: 用并查集解决最小生成树问题
- 代码: LeetCode1584.java
- 1971. 寻找图中是否存在路径
- 2867. 统计树中的合法路径数目
- 思路: 以合数为中心,搜素所有质数数量为0的路径 -> 求质数周围合数集团的节点数(DFS) -> 并查集优化
- 代码: LeetCode2867.java
- 5. 最长回文子串
- 思路: 遍历节点(中心展开) 或 2维的DP【思路很直接,但空间复杂度略高】
- 代码: LeetCode5.java
- 22. 括号生成
- 思路: (a)b 或 a0:ia[i:-1] 或 ab/(a)/a()/()a
- 代码: LeetCode22.java
- 32. 最长有效括号
- 思路: 考虑
(与)对应关系【输入尺度太大,不能用2维DP】 - 代码: LeetCode32.java
- 思路: 考虑
- 42. 接雨水
- 思路:
- 寻找可以盛水的区间 -> 找到节点i后第一个比它大的点,如果不存在则找高度>=height[i]-1的点 -> 单调栈(相对复杂)
- 累计每个位置能存放的水 -> 找到节点i左右两边的最大值 -> DP
- 代码: LeetCode42.java
- 思路:
- 53. 最大子数组和
- 思路: 状态f(i)为以i结尾的最大子数组和
- 代码: LeetCode53.java
- 62. 不同路径
- 代码: LeetCode62.java
- 63. 不同路径 II
- 代码: LeetCode63.java
- 64. 最小路径和
- 思路: 正向DP【需要注意填表的顺序】
- 代码: LeetCode64.java
- 70. 爬楼梯
- 代码: LeetCode70.java
- 72. 编辑距离
- 思路: 2维DP填表【关键是确定dp[i][j]与dp[i-1][j-1], dp[i][j-1], dp[i-1][j]的关系】
- 代码: LeetCode72.java
- 91. 解码方法
- 思路: 问题划分时需要考虑避免重合
- 代码: LeetCode91.java
- 96. 不同的二叉搜索树
- 思路: 子问题的划分是根据连续的节点数量,与节点大小无关
- 代码: LeetCode96.java
- 114. 二叉树展开为链表
- 思路: DFS + 状态保存
- 代码: LeetCode114.java
- 115. 不同的子序列
- 思路: 二维动态规划
- 代码: LeetCode115.java
- 121. 买卖股票的最佳时机
- 思路: 可以记住某个最值状态(最低/最高),类似动态规划
- 代码: LeetCode121.java
- 139. 单词拆分
- 思路: 先匹配一部分,在此基础上匹配剩余的部分【可以对单词长度排序从而优先匹配长单词】
- 代码: LeetCode139.java
- 152. 乘积最大子数组
- 思路: Nx2的DP,但由于当前状态只与前一个状态相关,可以进一步用两个变量代替DP数组
- 代码: LeetCode152.java
- 198. 打家劫舍
- 思路: 先找出最小的问题,再想想怎样扩大问题规模
- 代码: LeetCode198.java
- 279. 完全平方数
- 思路: 正向填表【需要注意到"平方"】
- 代码: LeetCode279.java
- 300. 最长递增子序列
- 思路: 正向填表,状态设置为"以i结尾的最长子序列长度" 或 "长度为i+1时LIS结尾的元素值"
- 代码: LeetCode300.java
- 322. 零钱兑换
- 思路: F(S) = min{F(S-C(1)), F(S-C(2)), ...} + 1 【正向填表】
- 代码: LeetCode322.java
- 354. 俄罗斯套娃信封问题
- 思路: 将问题转换为LIS,并通过排序避免宽度对高度的干扰
- 代码: LeetCode354.java
- 410. 分割数组的最大值
- 代码: LeetCode410.java
- 416. 分割等和子集
- 思路: 针对NP完全问题考虑时间复杂度与元素大小相关的动态规划,并压缩状态为一维
- 代码: LeetCode416.java
- 486. 预测赢家
- 思路: Min-Max + DP
- 代码: LeetCode486.java
- 509. 斐波那契数
- 思路: 递归填表,但只需保存两个状态
- 代码: LeetCode509.java
- 877. 石子游戏
- 思路: Min-Max + DP 或 脑筋急转弯
- 代码: LeetCode877.java
- 1143. 最长公共子序列
- 思路: 二维DP + 正向填表
- 代码: LeetCode1143.java
- 17. 电话号码的字母组合
- 思路: 记录映射关系,然后DFS + 回溯
- 代码: LeetCode17.java
- 46. 全排列
- 代码: LeetCode46.java
- 51. N 皇后
- 思路: 分离模型与视图 && 用abs(x1 - x2)!=abs(y1 - y2)判断是否在对角线上
- 代码: LeetCode51.java
- 78. 子集
- 代码: LeetCode78.java
- 131. 分割回文串
- 思路: 中心扩散 + DP + 回溯
- 代码: LeetCode131.java
- 175. 组合两个表
- 代码: LeetCode175.sql
- 176. 第二高的薪水
- 代码: LeetCode176.sql
- 177. 第N高的薪水
- 代码: LeetCode177.sql
- 178. 分数排名
- 代码: LeetCode178.sql
- 180. 连续出现的数字
- 代码: LeetCode180.sql
- 181. 超过经理收入的员工
- 代码: LeetCode181.sql
- 182. 查找重复的电子邮箱
- 代码: LeetCode182.sql
- 183. 从不订购的客户
- 代码: LeetCode183.sql
- 184. 部门工资最高的员工
- 代码: LeetCode184.sql
- 185. 部门工资前三高的所有员工
- 代码: LeetCode185.sql
- 196. 删除重复的电子邮箱
- 代码: LeetCode196.sql
- 197. 上升的温度
- 代码: LeetCode197.sql
- 262. 行程和用户
- 代码: LeetCode262.sql
- 511. 游戏玩法分析 I
- 代码: LeetCode511.sql
- 512. 游戏玩法分析 II
- 代码: LeetCode512.sql
- 534. 游戏玩法分析 III
- 代码: LeetCode534.sql
- 550. 游戏玩法分析 IV
- 代码: LeetCode550.sql
- 569. 员工薪水中位数
- 思路: 需要整合额外的信息,形成筛选条件
- 代码: LeetCode569.sql
- 570. 至少有5名直接下属的经理
- 代码: LeetCode570.sql
- 571. 给定数字的频率查询中位数
- 思路: 求出频率所在的区间【通过窗口函数的SUM】
- 代码: LeetCode571.sql
- 574. 当选者
- 代码: LeetCode574.sql
- 577. 员工奖金
- 代码: LeetCode577.sql
- 579. 查询员工的累计薪水
- 思路: 自连接 + 筛选
- 代码: LeetCode579.sql
- 578. 查询回答率最高的问题
- 代码: LeetCode578.sql
- 584. 寻找用户推荐人
- 代码: LeetCode584.sql
- 585. 2016年的投资
- 代码: LeetCode585.sql
- 586. 订单最多的客户
- 代码: LeetCode586.sql
- 595. 大的国家
- 代码: LeetCode595.sql
- 596. 超过5名学生的课
- 代码: LeetCode596.sql
- 597. 好友申请 I:总体通过率
- 代码: LeetCode597.sql
- 601. 体育馆的人流量
- 代码: LeetCode601.sql
- 602. 好友申请 II :谁有最多的好友
- 代码: LeetCode602.sql
- 603. 连续空余座位
- 代码: LeetCode603.sql
- 607. 销售员
- 代码: LeetCode607.sql
- 608. 树节点
- 代码: LeetCode608.sql
- 610. 判断三角形
- 代码: LeetCode610.sql
- 613. 直线上的最近距离
- 代码: LeetCode613.sql
- 619. 只出现一次的最大数字
- 代码: LeetCode619.sql
- 620. 有趣的电影
- 代码: LeetCode620.sql
- 626. 换座位
- 代码: LeetCode626.sql
- 627. 变更性别
- 代码: LeetCode627.sql
- 1045. 买下所有产品的客户
- 代码: LeetCode1045.sql
- 1050. 合作过至少三次的演员和导演
- 代码: LeetCode1050.sql
- 1068. 产品销售分析 I
- 代码: LeetCode1068.sql
- 1069. 产品销售分析 II
- 代码: LeetCode1069.sql
- 1070. 产品销售分析 III
- 代码: LeetCode1070.sql
- 1075. 项目员工 I
- 代码: LeetCode1075.sql
- 1076. 项目员工II
- 代码: LeetCode1076.sql
- 1077. 项目员工 III
- 代码: LeetCode1077.sql
- 1082. 销售分析 I
- 思路: 通过all筛选最大值
- 代码: LeetCode1082.sql
- 1083. 销售分析 II
- 思路: 按buyer_id分组后按照次数筛选
- 代码: LeetCode1083.sql
- 1084. 销售分析III
- 思路: 尽可能减少遍历次数
- 代码: LeetCode1084.sql
- 1112. 每位学生的最高成绩
- 代码: LeetCode1112.sql
- 1113. 报告的记录
- 思路: 注意distinct的使用位置【处理单列的速度明显高于双列】
- 代码: LeetCode1113.sql
- 1141. 查询近30天活跃用户数
- 代码: LeetCode1141.sql
- 1148. 文章浏览 I
- 代码: LeetCode1148.sql
- 1158. 市场分析 I
- 代码: LeetCode1158.sql
- 1164. 指定日期的产品价格
- 代码: LeetCode1164.sql
- 1173. 即时食物配送 I
- 代码: LeetCode1173.sql
- 1174. 即时食物配送 II
- 代码: LeetCode1174.sql
- 1179. 重新格式化部门表
- 代码: LeetCode1179.sql
- 1193. 每月交易 I
- 代码: LeetCode1193.sql
- 1204. 最后一个能进入巴士的人
- 代码: LeetCode1204.sql
- 1211. 查询结果的质量和占比
- 代码: LeetCode1211.sql
- 1212. 查询球队积分
- 代码: LeetCode1212.sql
- 1225. 报告系统状态的连续日期
- 思路: 类似LeetCode1285,但处理起来略复杂
- 代码: LeetCode1225.sql
- 1251. 平均售价
- 代码: LeetCode1251.sql
- 1264. 页面推荐
- 代码: LeetCode1264.sql
- 1270. 向公司 CEO 汇报工作的所有人
- 代码: LeetCode1270.sql
- 1280. 学生们参加各科测试的次数
- 代码: LeetCode1280.sql
- 1285. 找到连续区间的开始和结束数字
- 思路:
- diff相同的log_id属于一个区间
- start_id就是log_id - 1不在表中的log_id,end_id同理
- 代码: LeetCode1285.sql
- 思路:
- 1303. 求团队人数
- 代码: LeetCode1303.sql
- 1321. 餐馆营业额变化增长
- 代码: LeetCode1321.sql
- 1322. 广告效果
- 代码: LeetCode1322.sql
- 1327. 列出指定时间段内所有的下单产品
- 代码: LeetCode1327.sql
- 1341. 电影评分
- 代码: LeetCode1341.sql
- 1350. 院系无效的学生
- 代码: LeetCode1350.sql
- 1378. 使用唯一标识码替换员工ID
- 代码: LeetCode1378.sql
- 1393. 股票的资本损益
- 代码: LeetCode1393.sql
- 1398. 购买了产品 A 和产品 B 却没有购买产品 C 的顾客
- 代码: LeetCode1398.sql
- 1407. 排名靠前的旅行者
- 代码: LeetCode1407.sql
- 1412. 查找成绩处于中游的学生
- 代码: LeetCode1412.sql
- 1440. 计算布尔表达式的值
- 代码: LeetCode1440.sql
- 1445. 苹果和桔子
- 代码: LeetCode1445.sql
- 1484. 按日期分组销售产品
- 代码: LeetCode1484.sql
- 1495. 上月播放的儿童适宜电影
- 代码: LeetCode1495.sql
- 1501. 可以放心投资的国家
- 代码: LeetCode1501.sql
- 1511. 消费者下单频率
- 代码: LeetCode1511.sql
- 1517. 查找拥有有效邮箱的用户
- 代码: LeetCode1517.sql
- 1527. 患某种疾病的患者
- 代码: LeetCode1527.sql
- 1532. 最近的三笔订单
- 代码: LeetCode1532.sql
- 1549. 每件商品的最新订单
- 代码: LeetCode1549.sql
- 1571. 仓库经理
- 代码: LeetCode1571.sql
- 1581. 进店却未进行过交易的顾客
- 代码: LeetCode1581.sql
- 1587. 银行账户概要 II
- 代码: LeetCode1587.sql
- 1596. 每位顾客最经常订购的商品
- 代码: LeetCode1596.sql
- 1607. 没有卖出的卖家
- 代码: LeetCode1607.sql
- 1633. 各赛事的用户注册率
- 代码: LeetCode1633.sql
- 1661. 每台机器的进程平均运行时间
- 代码: LeetCode1661.sql
- 1667. 修复表中的名字
- 代码: LeetCode1667.sql
- 1683. 无效的推文
- 代码: LeetCode1683.sql
- 1693. 每天的领导和合伙人
- 代码: LeetCode1693.sql
- 1699. 两人之间的通话次数
- 代码: LeetCode1699.sql
- 1709. 访问日期之间最大的空档期
- 代码: LeetCode1709.sql
- 1729. 求关注者的数量
- 代码: LeetCode1729.sql
- 1731. 每位经理的下属员工数量
- 代码: LeetCode1731.sql
- 1741. 查找每个员工花费的总时间
- 代码: LeetCode1741.sql
- 1747. 应该被禁止的 Leetflex 账户
- 代码: LeetCode1747.sql
- 1757. 可回收且低脂的产品
- 代码: LeetCode1757.sql
- 1767. 寻找没有被执行的任务对
- 思路: 先用RCTE生成数字序列,从而获取所有的任务对,再进一步找出未执行的任务对
- 代码: LeetCode1767.sql
- 1783. 大满贯数量
- 代码: LeetCode1783.sql
- 1789. 员工的直属部门
- 代码: LeetCode1789.sql
- 1795. 每个产品在不同商店的价格
- 代码: LeetCode1795.sql
- 1821. 寻找今年具有正收入的客户
- 代码: LeetCode1821.sql
- 1831. 每天的最大交易
- 代码: LeetCode1831.sql
- 1873. 计算特殊奖金
- 代码: LeetCode1873.sql
- 1890. 2020年最后一次登录
- 代码: LeetCode1890.sql
- 1907. 按分类统计薪水
- 代码: LeetCode1907.sql
- 1934. 确认率
- 代码: LeetCode1934.sql
- 1965. 丢失信息的雇员
- 代码: LeetCode1965.sql
- 1978. 上级经理已离职的公司员工
- 代码: LeetCode1978.sql
- 2356. 每位教师所教授的科目种类的数量
- 代码: LeetCode2356.sql
- 3220. 奇数和偶数交易
- 代码: LeetCode3220.sql
- 3421. 查找进步的学生
- 代码: LeetCode3421.sql