to-do:看一下别人写的题解
0. Tips
a. 算法复杂度估算经验
在竞赛中,一般算机一秒能运行5 x 10^8次汁算,
- 一般 O(n)的算法数据范围n < 10^8。
- O(n *logn)的算法数据范围n <= 10^6。
- O(n*sqrt(n) )的算法数据范围n < 10^5。
- O(n^2)的算法数据范围n<5000。
- O(n^3)的算法数据范围n <300。
- O(2^n)的算法数据范围n < 25。
- O(n!)的算法数据范围n < 11。
一般来说,题目设计的时候,都会考虑让一个正确的而且没有经过高度优化的解通过。意思就是,除非写的非常非常瞎(就是常数非常大),不然不应该会超时。或者说也有可能你看到的代码经过了极端的优化,意外的通过了。一般来说,“时间复杂度是够的,但是却超时了”的情况是很少发生的(不是没有,确实有的题目卡常数)
1. 数学思想
题解 | 方法 | 说明 | 完成时间 |
---|---|---|---|
119. 杨辉三角 II | 动态规划、通项公式 | 观察数学规律 | 2021.2.12 |
1823. 找出游戏的获胜者 | 模拟、递归、约瑟夫环 | 递归思想 | 2022.5.4 |
2. 数据结构
2.1 字符串
题解 | 思想 | 时间 |
---|---|---|
696. 计数二进制子串 | 一次遍历字符串 | 2020.08.12 |
2.2 数组
题解 | 思想 | 时间 |
---|---|---|
189.旋转数组 | - | 20.1.30 |
896. 单调数列 | 两次遍历or一次遍历 | 2021.2.28 |
2.3 矩阵
题解 | 思想 | 时间 |
---|---|---|
54. 螺旋矩阵 | 缩边 | 2021.03.16 |
59. 螺旋矩阵 II | 缩边 | 2021.03.16 |
2.4 链表
索引 | 题解 | 最优算法 | 替代算法 | 备注 | 完成时间 |
---|---|---|---|---|---|
0 | 206. 反转链表 | 1.迭代 2.递归 | 所有节点 | 20.1.27 | |
1 | 92. 反转链表 II | 1.迭代 2.递归 | 0的进阶版:从m到n的节点 | 20.1.27 | |
2 | 24. 两两交换链表中的节点 | 1.迭代 2.递归 | 20.1.27 | ||
3 | 114. 二叉树展开为链表 | 递归 | 20.1.27 | ||
4 | 234. 回文链表 | 反转 | 1.stack 2.half stack 3.递归 | 20.1.27 | |
5 | 25. K 个一组翻转链表 | 尾插法 | 1.递归 2.堆栈 | 2的普适版 1的递归版 | 20.1.28 |
6 | 138. 复制带随机指针的链表 | 影子法 | dfs/bfs+hash | 算法新颖 | 20.1.28 |
7 | 141. 环形链表 | 快慢双指针 | 20.1.28 | ||
8 | 142. 环形链表 II | 快慢双指针+数学推导 | 结论记住 | 20.1.28 | |
9 | 86. 分隔链表 | 双指针 | 20.1.28 | ||
10 | 143. 重排链表 | 反转后半 | stack | 跟4相像 | 20.1.28 |
11 | 160. 相交链表 | 1.尾部对齐 2.链表拼接 | visited hash | 可转化为8 | 20.1.29 |
12 | 61. 旋转链表 | 取模+移动head | 20.1.29 | ||
13 | 21. 合并两个有序链表 | 1.迭代 2.递归 | 20.1.30 | ||
14 | 23. 合并K个排序链表 | 1.最小堆 2.分治 | 13的进阶版 | 20.1.30 | |
15 | 203. 移除链表元素 | 线性遍历 | easy | 20.1.31 | |
16 | 83. 删除排序链表中的重复元素 | 线性遍历 | 官方题解用循环不变式验证算法正确性 | 20.1.31 | |
17 | 82. 删除排序链表中的重复元素 II | 线性遍历 | 20.1.31 |
2.5 树
- 概念
- 二叉树:每个节点至多只有两个子节点的树。
- 二叉搜索树:BST,全部左子孙节点 < val < 全部右子孙节点
- 完全二叉树:除了最后一层外,每层都被完全填充。最后一层的节点从左到右填充。
- 满二叉树:每个节点都有0个或2个子节点,即不存在只有1个子节点的节点。
- 完美二叉树:完全二叉树+满二叉树。正好有个节点。
- 平衡树:是指“不是非常不平衡”的树。它的平衡性足以确保执行insert和find操作可以在O(logn)的时间复杂度完成,但并不一定是严格意义上的平衡树。
- 红黑树
- AVL树
- 二叉树:每个节点至多只有两个子节点的树。
- 操作
- 遍历
- BST的中序遍历会从小到大遍历每个元素。
- 遍历
题解 | 题目 | 算法 | 3种语言 | 完成时间 |
---|---|---|---|---|
104. 二叉树的最大深度 | - | dfs | yep | 2020.01 |
111. 二叉树的最小深度 | - | dfs | yep | 2020.01 |
112. 路径总和 | bool | dfs | yep | 2020.01 |
113. 路径总和 II | 返回list[list] | dfs+回溯 | yep | 2020.4.22 |
437. 路径总和 III | int | dfs+前缀和 | yep | 2020.5.13 |
199. 二叉树的右视图 | 返回list | bfs dfs | yep | 2020.4.22 |
236. 二叉树的最近公共祖先(leetcode) | - | - | - | - |
88. 最近公共祖先(lintcode) | 返回节点 | dfs | yep | 2020.4.22 |
117. 填充每个节点的下一个右侧节点指针 II | 添加指针 | 迭代 层序 | nope | 2020.5.13 |
124. 二叉树中的最大路径和 | 路径和 | dfs | nope | 2020.5.13 |
99. 恢复二叉搜索树 | 中序遍历 | dfs morris | nope | 2020.5.13 |
2.6 堆/优先级队列
- 最小堆
- 概念
- 最小堆是一种完全二叉树,每个节点都比它的子节点小。因此,根是树中的最小元素。
- 操作
- 建堆
- 自底向上↑。从第一个非叶节点开始,将其与它左右节点中的最小值交换,并且向下递归。直到调整完根结点。时间复杂度为O(nlog(n))。
- 插入insert
- 自底向上↑。先插入到最后一层的右边,然后向上递归修复,与父节点进行交换,直到最小堆的属性得以恢复。时间复杂度为O(log(n))。
- 提取最小元素extract_min
- 自顶向下↓。删除最小元素,把最后一个元素移上来。然后向下传递这个元素,即选择左右子节点中的最小元素交换,直到最小堆的属性得以恢复。时间复杂度为O(log(n))。
- 建堆
- 概念
题解 | 算法 | 原数据结构 | 任务 | 备注 | 完成时间 |
---|---|---|---|---|---|
215. 数组中的第K个最大元素 | 堆的三种方法 | nums[] |
第k大 | 经典任务 | 2021.2.12 |
632. 最小区间 | 最小堆/滑窗法 | k个数组 List[List[int]]
|
计算区间 | 最小值靠堆,最大值靠比较 | 2020.1.21 |
23. 合并K个排序链表 | 最小堆 | k个链表List[ListNode]
|
合并 | 每步只需找最小值 | 2020.1.30 |
264. 丑数 II | 最小堆/三指针 | 从1开始 | 第n个 | 经典 | 2020.5.3 |
1439. 有序矩阵中的第 k 个最小数组和 | 暴力解法/最小堆/二分法 | 矩阵mat: List[List[int]]
|
第k个 | 堆中[curr_sum, pointers] 跟丑数很像 |
2020.5.3 |
378. 有序矩阵中第K小的元素 | 最小堆/二分 | 矩阵mat: List[List[int]]
|
第k个 | 堆中[row, col, val] 跟丑数很像 |
2020.5.3 |
295. 数据流的中位数 | 两个堆 | - | 动态查询中位数 | 可用multiset | 2020.5.6 |
347. 前 K 个高频元素 | 最小堆 | 数组nums[]
|
第k个高频元素 | hashmap | 2021.2.11 |
- 215是很经典的题,可以用堆/快速选择来做,堆这里提供了3种方法,注意想清楚“第k大”和“第k小”的区别,想清楚堆的大小。
- 347是215的延伸,同样使用大小为k的最小堆,只不过要先建立频率map。
2.7 单调栈
题解 | 任务 | 说明 | 完成时间 |
---|---|---|---|
剑指 Offer 59 - II. 队列的最大值 | 实现类 | 与面试题 03.02. 栈的最小值一样 | 2021.2.14 |
496. 下一个更大元素 I | 数组中找下一个更大值 | 单调栈取代双重循环 | 2020.6 |
503. 下一个更大元素 II | 数组中找下一个更大值 | 循环数组 | 2020.6 |
84. 柱状图中最大的矩形 | 求上一个和下一个更小元素 | 使用哨兵可以简化代码 | 2021.3.14 |
5704. 好子数组的最大分数 | 求min(区间)*len(区间)的最大值 | 很好的题目,是84. 柱状图中最大的矩形的升级版,加入了k 作为限制;也可以用双指针 |
2021.3.14 |
907. 子数组的最小值之和 | 是84. 柱状图中最大的矩形的简化版 | 使用哨兵可以简化代码 | 2022.05.05 |
2.8 图
题解 | 思路 | 时间 |
---|---|---|
133. 克隆图 | bfs dfs | 2020.8.12 |
127. 单词接龙 | bfs 双向bfs | 2020.11.5 |
433. 最小基因变化 | bfs 类似127. 单词接龙 | 2022.05.07 |
3. 算法
3.1 快速排序 & 快速选择
O(n^2):冒泡排序、选择排序、插入排序
O(nlogn):快速排序、希尔排序、堆排序、归并排序
题解 | 说明 | 完成时间 |
---|---|---|
912. 排序数组 | 笔记 | 2020.5.7 |
215. 数组中的第K个最大元素 | 同上 | 2020.5.7 |
3.2 分治法
先区分一下概念
- 二分查找:分
- 合并两个有序数组:治
- 对无序数组进行排序:分治
归并排序就是“分治法”的一种,尽管名字中只体现了“治”。
题解 | 说明 | 完成时间 |
---|---|---|
912. 排序数组 | 归并排序 | 2020.4.25 |
面试题51. 数组中的逆序对 | 有返回值的归并排序 | 2020.4.25 |
53. 最大子序和 | 动态规划/有返回值不排序 | 2020.5.3 |
3.3 滑窗法
滑窗,是一种同向双指针技巧。通常题目中会出现“最长”“最小”等限定词。
labuladong滑窗法
题解 | 数据结构 | 移动 | 说明 | 完成时间 |
---|---|---|---|---|
3. 无重复字符的最长子串 | hashset/hashmap | 右1左while | 2019.8 / 2021.2.10 | |
239. 滑动窗口最大值 | labuladong单调队列 | 2020.4.26 | ||
1425. 带限制的子序列和 | 动态规划+单调队列 | 2020.4.26 | ||
76. 最小覆盖子串 | hashmap | 2020.5.2 | ||
5402. 绝对差不超过限制的最长连续子数组 | 单调队列 | 2020.5.3 | ||
632. 最小区间 | hashmap/频次数组 | 2020.8.8 | ||
209. 长度最小的子数组 | int | 右1左while | 2020.5.x | |
992. K 个不同整数的子数组 | 频次数组 | 右1左while | “恰好 ”的理解 | 2021.2.9 |
424. 替换后的最长重复字符 | 频次数组 | 右1左if | 只看长度,区间无需合法 | 2021.2.10 |
443. 压缩字符串 | - | 右1左if while | 三指针 | 2021.2.14 |
1004. 最大连续1的个数 III | int个数 | 右1左if | 只看长度,区间无需合法 | 2021.2.19 |
395. 至少有K个重复字符的最长子串 | 频次hashmap | 右1左while | 手动加入限制 | 2021.2.27 |
- 3 vs 424:两者的相似点在于都只看区间长度。不同之处在于424可以不用保证区间实时是合法的,只需长度ok;但3不能这么做,因为424只考虑最长重复字符的频率,3需要考虑每个字符的频率只出现1次,3要保证区间实时合法。1004是424的退阶。
- 992:比较特殊,设计了滑窗函数,用差值来表示“恰好”的概念。
3.4 动态规划
题解 | 算法 | 完成时间 |
---|---|---|
62. 不同路径 | 组合/二维动态规划/一维动态规划 | 2020/4/27 |
887. 鸡蛋掉落 | 二维动态规划/记忆化搜索 | 2020/5/2 |
983. 最低票价 | 一维动态规划 | 2020/5/6 |
1434. 每个人戴不同帽子的方案数 | 动态规划+状态压缩 | 2020/5/6 |
132. 分割回文串 II | 动态规划 记忆化搜索 | 2021/3/8 |
115. 不同的子序列 | 二维动态规划 | 2021/3/18 |
3.5 二分查找
索引 | 题解 | 有序 | 有重复元素 | 旋转数组 | 目标任务 | 备注 | 完成时间 |
---|---|---|---|---|---|---|---|
0 | 704. 二分查找 | √ | x | x | 查找 | 20.1.29 | |
1 | 35. 搜索插入位置 | √ | x | x | 查找和插入 | 0的进阶版 | 20.1.29 |
2 | 34. 在排序数组中查找元素的第一个和最后一个位置 | √ | √ | × | 查找区间 | 0的进阶版 | 20.1.29 |
3 | 153. 寻找旋转排序数组中的最小值 | √ | × | √ | 找最小值 | 20.1.29 | |
4 | 154. 寻找旋转排序数组中的最小值 II | √ | √ | √ | 找最小值 | 3的进阶版 | 20.1.29 |
5 | 33. 搜索旋转排序数组 | √ | × | √ | 查找 | 20.1.30 | |
6 | 81. 搜索旋转排序数组 II | √ | √ | √ | 查找 | 5的进阶版 | 20.1.30 |
7 | 222. 完全二叉树的节点个数 | 节点个数 | 20.1.30 | ||||
8 | 300. 最长上升子序列 | √ | × | 覆盖 | 二分法是其中一步 | 19.7.x |
p.s. 若要加深对旋转数组的理解,请戳189.旋转数组。
3.6 对值的二分
- 注:在对值的二分中,原区间一般都是包含可行解的,不会存在全fail的情况。
求最大可行解
while left <= right:
mid = left + (right - left) // 2
if canWork(mid):
left = mid + 1
else:
right = mid - 1
return right
求最小可行解
while left < right:
mid = left + (right - left) // 2
if canWork(mid):
right = mid
else:
left = mid + 1
return left
题解 | 方法 | 时间 |
---|---|---|
378. 有序矩阵中第K小的元素 | 最小堆/二分法 | 2020.5.3 |
1439. 有序矩阵中的第 k 个最小数组和 | 暴力解法/最小堆/二分法 | 2020.5.6 |
410. 分割数组的最大值 | 二分法 | 2020.5.6 |
LCP 12. 小张刷题计划 | 二分法 | 2020.5.6 |
2226. 每个小孩最多能分到多少糖果 | 二分法 | 20222.05.08 |
3.7 双指针
题解 | 数据结构 | 指针类型 | 时间 |
---|---|---|---|
27. 移除元素(官方) | 数组 | 同向双指针 | 2020.04.20 |
26. 删除排序数组中的重复项 | 数组 | 同向双指针 | 2020.04.20 |
80. 删除排序数组中的重复项 II | 数组 | 同向双指针 | 2020.04.20 |
575. 分糖果 | 数组 | 同向双指针 | 2020.04.20 |
42. 接雨水 | 数组 | 相向双指针 | 2020.02 |
11. 盛最多水的容器 | 数组 | 相向双指针 | 2020.02 |
15. 三数之和 | 数组 | 相向双指针 | 2020.04.20 |
16. 最接近的三数之和 | 数组 | 相向双指针 | 2020.04.20 |
75. 颜色分类 | 数组 | 边界双指针+遍历指针 | 2020.04.20 |
202. 快乐数 | 公式 | 快慢双指针 找环 | 2020.04.30 |
905. 按奇偶排序数组 | 数组 | 相向双指针 | 2022.04.28 |
713. 乘积小于 K 的子数组 | 数组 | 同向双指针 | 2022.05.05 |
3.8 回溯/dfs
- 回溯是dfs的特殊情况。
- list做参数时会回溯
- 无list做参数时,只dfs无回溯,还能考虑dp解法。
题解 | 思路 | 补充 | 时间 |
---|---|---|---|
46. 全排列 | swap used数组 | liweiwei labuladong | 2020.04.20 |
47. 全排列 II | used数组 | - | 2020.04.20 |
78. 子集 | dfs 两种递归树 | liweiwei | 2020.4.25 |
90. 子集 II | 排序+dfs+剪枝 | - | 2020.4.25 |
51. N皇后 | backtrack + isValid | labuladong | 2020.3 |
52. N皇后 II | backtrack + isValid | 位运算 | 2020.3 |
37. 解数独 | backtrack + isValid | 三种语言 | 2020.4.29 |
39. 组合总和 | backtrack | 笔记 | 2020.4.30 |
40. 组合总和 II | backtrack | 同上 | 2020.4.30 |
216. 组合总和 III | backtrack | 同上 | 2020.4.30 |
377. 组合总和 Ⅳ | dfs / dp | 同上 | 2020.4.30 |
518. 零钱兑换 II | dfs / dp | 同上 | 2020.4.30 |
77. 组合 | backtrack | 同上 | 2020.4.30 |
17. 电话号码的字母组合 | backtrack | 同上 | 2020.4.30 |
139. 单词拆分 | dp | - | 2020.11.4 |
140. 单词拆分 II | backtrack+memo | 其他人的题解,配合自己的代码 | 2020.11.4 |
131. 分割回文串 | backtrack+memo | 2021.3.8 | |
417. 太平洋大西洋水流问题 | dfs | can't dp | 2022.04.28 |
3.9 位运算
我的笔记:https://www.jianshu.com/p/c4cf3d188900
题解 | 思路 | 时间 |
---|---|---|
169. 多数元素 | 哈希表 排序法 随机化 分治法 投票法 位运算 | 2020.3.13 |
1178. 猜字谜 | 位运算 二进制子集遍历 | 2021.2.26 |
3.10 前缀和
区间 -> 值
题目 | 思路 | 时间 |
---|---|---|
303. 区域和检索 - 数组不可变 | 前缀和/线段树 | 2021.03.01 |
304. 二维区域和检索 - 矩阵不可变 | 前缀和 | 2021.03.02 |
值 -> 区间
题目 | 思路 | 时间 |
---|---|---|
560. 和为K的子数组 | 前缀和+动态哈希表,层层优化 | 2021.03.02 |
线段树
3.11 并查集
我的笔记:
3.12 蓄水池抽样
- 蓄水池抽样的适用场景:
- (1)从所有样本中抽取若干个,要求每个样本被抽到的概率相等。
- (2)总的样本数量未知,或数据量非常大、难以一次读取。
- 蓄水池抽样的复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)
- 注:如果仅有条件1,那么用普通的随机数就可以:空间复杂度为O(n),初始化时间复杂度为O(n),请求时间复杂度为O(1)
题目 | 思路 | 时间 |
---|---|---|
398. 随机数索引 | 蓄水池抽样 | 2022.04.26 |
382. 链表随机节点 | 蓄水池抽样 | 2022.04.26 |
3.13 原位哈希
题目 | 思路 | 备忘 | 时间 |
---|---|---|---|
442. 数组中重复的数据 | 交换 / 负号 | 交换时a,b不能写反 | 2022.05.08 |
448. 找到所有数组中消失的数字 | 交换 / 负号 | 同442. 数组中重复的数据,注意返回的是索引不是值 | 2022.05.08 |
4. 问题归纳
4.1 子序列
连续子序列 vs 子序列
x | 有序 | 连续 | 思路 |
---|---|---|---|
1. 子序列 | √ | × | 贪心/dp |
2. 连续子序列/子串 | √ | √ | 滑窗/dp/单调栈 |
3. 排列/重排 | × | √ | dfs |
- 300. 最长上升子序列 | 动态规划 or 贪心+二分 | O(nlog(n))+O(n)
- 128. 最长连续序列 | 非常简单的一次遍历 | O(n)+O(1)
- 53. 最大子序和 | 一次遍历/分治 | O(n) / O(nlog(n))
-
152. 乘积最大子数组 | 双dp | O(n)
354. 俄罗斯套娃信封问题 | 二维最长上升子序列 | O(nlog(n))
4.2 区间
题解 | 算法 | 备注 | 完成时间 |
---|---|---|---|
56. 合并区间 | 先排序再遍历 | 官方题解 | 2020.6 |
57. 插入区间 | 模拟遍历 | 官方题解 | 2020.11.4 |
5. 常见系列
5.1 N数之和
题解 | 思路 | 时间 |
---|---|---|
15. 三数之和 | 排序+相向双指针 | 2020.04.20 |
16. 最接近的三数之和 | 排序+相向双指针 | 2020.04.20 |
5.2 接雨水
题解 | 思路 | 时间 |
---|---|---|
42. 接雨水 | 双指针 | 2020.02 |
11. 盛最多水的容器 | 动态规划 双指针 | 2020.02 |
5.3 山脉数组
题解 | 思路 | 时间 |
---|---|---|
852. 山脉数组的峰顶索引 | 二分查找 | 2020.4.29 |
941. 有效的山脉数组 | 线性扫描 | 2020.4.29 |
845. 数组中的最长山脉 | 状态机 | 2020.4.29 |
1095. 山脉数组中查找目标值 | 3次二分查找 | 2020.4.29 |
5.4 股票问题
题解 | 题目 | 思路 | 时间 |
---|---|---|---|
121. Best Time to Buy and Sell Stock | 最多一次交易 | 贪心法 | 2019.8 |
122. Best Time to Buy and Sell Stock II | 无限次交易 | 贪心法 | 2019.8 |
123. Best Time to Buy and Sell Stock III | 最多两次交易 | 二分贪心/动态规划 | 2019.8 |
188. Best Time to Buy and Sell Stock IV | 最多k次交易 | 动态规划(二维背包) | 2020.4.19 |
5.5 跳跃游戏
题解 | 题目 | 思路 | 时间 |
---|---|---|---|
55. 跳跃游戏 | 单向 能不能跳到最后 | 贪心 | 2020.02 |
45. 跳跃游戏 II | 单向 最少步数 | 贪心 | 2020.02 |
1306. 跳跃游戏 III | 双向 能不能跳到某处 | bfs | 2020.02 |
1340. 跳跃游戏 V | 双向 最多访问多少 | 动态规划 | 2020.02 |
5.6 爬楼梯
题解 | 题目 | 思路 | 时间 |
---|---|---|---|
70. 爬楼梯 | 多少种方法 排列问题 | 动态规划 空间可优化到O(1) | 2019/07 |
746. 使用最小花费爬楼梯 | 最小花费 | 动态规划 空间可优化到O(1) | 2020/04/19 |
5.7 零钱兑换
题解 | 题目 | 思路 | 时间 |
---|---|---|---|
322. 零钱兑换 | 最小硬币个数 | 1d动态规划/ dfs+贪心 | 2020/4/19 |
518. 零钱兑换 II | 有多少硬币组合 组合问题 | 1d动态规划 | 2020/4/19 |
5.8 二维有序矩阵
题解 | 思路 | 时间 |
---|---|---|
74. 搜索二维矩阵 | 二分/区间缩减 | 2020.5.2 |
240. 搜索二维矩阵 II | 区间缩减 题解见上 | 2020.5.2 |
378. 有序矩阵中第K小的元素 | 最小堆/二分法 | 2020.5.3 |
5.9 岛屿
题解 | 思路 | 时间 |
---|---|---|
200. 岛屿数量 | bfs dfs 并查集 | 19.6.x |
434. 岛屿的个数II(lintcode) | 并查集 | 2020.4.18 |
695. 岛屿的最大面积 | bfs dfs | 20.3.15 |
1254. 统计封闭岛屿的数目 | bfs dfs | 20.3.16 |
5.10 组合问题-回溯法
我的笔记:https://www.jianshu.com/p/5b835e543bdf
5.11 图染色问题
6. 特殊方法
6.1 覆盖法
题解 | 思路 | 时间 |
---|---|---|
300. 最长上升子序列 | 覆盖法+二分法 | 19.7.x |
6.2 投票法
题解 | 思路 | 时间 |
---|---|---|
169. 多数元素 | 哈希表 排序法 随机化 分治法 投票法 位运算 | 20.3.13 |
229. 求众数 II | 投票法 | 20.3.16 |
7. 其他问题
7.1 三维几何
题解 | 思路 | 时间 |
---|---|---|
883. 三维形体投影面积 | 空间想象能力 | 2022.4.26 |
8. 周赛
第181场周赛 2020/3/22
比赛链接
1391. 检查网格中是否存在有效路径 | dfs(看提交记录) | 2020.5.7
1392. 最长快乐前缀 | 字符串hash kmp的第一步(看提交记录)| 2020.5.7
第182场周赛 2020/3/29
比赛链接
1397. 找到所有好字符串 | 数位dp+kmp | forget it...
第183场周赛 2020/4/5
比赛链接
1405. 最长快乐字符串 | 贪心 | 2020.4.5
1406. 石子游戏 III | 博弈dp | 2020.4.5
LCP春季编程大赛 个人赛 2020/4/18
第24场双周赛 2020/4/18
周赛链接
和为 K 的最少斐波那契数字数目 | 2020.4.18
第 185 场周赛 字节跳动 2020/4/19
周赛链接
5390. 数青蛙 | 2020.4.19
5391. 生成数组 | 2020.4.19
第 186 场周赛 2020/4/26
周赛链接
5394. 对角线遍历 II | 2020.4.26
5180. 带限制的子序列和 | 2020.4.26
LCP春季编程大赛 战队赛 2020/4/26
第 25 场双周赛 2020/5/2
周赛链接
1432. 改变一个整数能得到的最大差值 | 精心/暴力 |2020/5/2
1434. 每个人戴不同帽子的方案数 |动态规划+状态压缩 | 2020/5/6
第 187 场周赛 2020/5/3
周赛链接
5402. 绝对差不超过限制的最长连续子数组 | 滑窗+单调队列 | 2020.5.3
1439. 有序矩阵中的第 k 个最小数组和 | 暴力解法/最小堆/二分法 |2020.5.3
第 188 场周赛 图森未来 2020/5/10
5405. 形成两个异或相等数组的三元组数目 | 位运算 | 2020.5.10
5406. 收集树上所有苹果的最少时间 | dfs | 2020.5.10
5407. 切披萨的方案数 | dp | 2020.5.10
第 188 场周赛 2020/5/17
- 数位成本和为目标值的最大数字 dfs超时 dp通过
第 188 场周赛 2020/5/17
比赛链接
最后一题我服了 这周的两场比赛表现都不好qwq
5415. 圆形靶内的最大飞镖数量
- 双字符串 循环
466. 统计重复个数
第 32 场双周赛 2020/8/8
比赛链接
5468. 第 k 个缺失的正整数:这道题可以对比268. 缺失数字(位运算)和字节的面试题41. 缺失的第一个正数(列表/位运算,最优时间复杂度为O(n),不是O(max(arr))
第 228 场周赛 2021/2/14
比赛链接
时隔半年后参加周赛orz 这次竞赛的每道题都好简单,不过有事儿没做完,只做出来前两道题。
5676. 生成交替二进制字符串的最少操作数:当字符串长度固定时,只有两种交替字符串。
5677. 统计同构子字符串的数目:简单的滑窗法,注意书写简洁。
5678. 袋子里最少数目的球:对值的二分,还是有点容易写错
5679. 一个图中连通三元组的最小度数:似乎没难度…
第 229 场周赛 2021/2/21
比赛链接
只做出来两道qwq
1768. 交替合并字符串:单指针,送分。
1769. 移动所有球到每个盒子所需的最小操作数:分为左右两边考虑,实时维护变量,注意考虑清楚当boxes[i]=='1'
的处理情况。
1770. 执行乘法运算的最大分数:二维动态规划,不算难,但是容易写错。
1771. 由子序列构造的最长回文串的长度:二维动态规划,关键在于1. 遍历的方向 2. 如何避免空集。
516. 最长回文子序列:动态规划,记住套路。
1143. 最长公共子序列:动态规划
第 230 场周赛 2021/2/28
比赛链接
做出来前三道题,第四道好难。
5689. 统计匹配检索规则的物品数量:送分题,对数组一次遍历
5690. 最接近目标价格的甜点成本:dfs回溯,与硬币题类似,写法已经很熟练了,复杂度为。
5691. 通过最少操作次数使数组的和相等:贪心法,先改变操作空间大的元素。
5692. 车队 II:step1,想到写双重循环来做,不过n=10^5,会超时。 step2,引入单调栈,优化为O(n)的复杂度。
853. 车队
第 47 场双周赛 2021/3/6
比赛链接
很简单,但只做出来前三题,最后一题超时了。
1779. 找到最近的有相同 X 或 Y 坐标的点:送分
1780. 判断一个数字是否可以表示成三的幂的和:注意是不同的幂,所以更简单了,循环减就可以
1781. 所有子字符串美丽值之和:双重循环+最大最小值,O(nn26)
1782. 统计点对的数目:精心卡时间复杂度。不能扫描点对,需要先按点计数,然后扫描边去重。
第232场周赛 2021/3/14
无敌简单,4道ace,但排名才400+,因为最后一题时间复杂度我没算好,一直超时,最后才发现其实很简单。
5701. 仅执行一次字符串交换能否使两个字符串相等:虽然做出来了,但写复杂了。
5702. 找出星型图的中心节点:O(1)解法
5703. 最大平均通过率:典型的堆,元素是三元组,如何制定优先选择的规则
5704. 好子数组的最大分数:1. 双指针,比11. 盛最多水的容器
更简单 2. 单调栈
第48场双周赛 2021/3/20
比赛链接
排名291 / 2853。
5693. 字符串中第二大的数字:送分。
5694. 设计一个验证系统:Hashmap。高级做法:LRU,双向链表。
第233场周赛 2021/3/21
比赛链接
有点难,做出了3/4,排名568 / 5009。最后一题没见过。一定要想好复杂度再动手,不要做无用功。
5709. 最大升序子数组和:一次遍历。审题要细致,这里是“连续子数组”,O(n)一次遍历就行;我最开始理解成了“子数组”,用了O(n2)动态规划。
5710. 积压订单中的订单总数:看数据量,是10^5,用堆。
5711. 有界数组中指定下标处的最大值:二分法,模板。
LCCUP 力扣杯2021春季编程大赛-个人赛 2021/04/05
- 总体感受
- 129/9000+,还可以吧。
- 前三题一遍过,总用时30+min,直接看提交记录;
- 倒数第二题用DFS,但剪枝没剪到位,没想到魔法卷轴的等效,超时了;
- 最后一题可以想到贪心法,遍历时间,找能完成任务多的时间段;想不到不超时的方法。
LCP 28. 采购方案:典型的双指针问题。先排序,两个指针从两侧向内走。
LCP 29. 乐团站位:数学题,同余问题,先把最外面的圈给算出来,然后计算该位置是第几个。
LCP 30. 魔塔游戏:贪心法+堆。当sum变为负数时,就从堆里找个最小的负数放在后面,如果堆空了返回false,以及如果加上所有放在后的负数后小于0,也返回false。
第 287 场周赛 2022/04/03 地平线
比赛结束后虚拟竞赛的~这场竞赛非常简单,四道题都做出来了,结果300+/6000+。这个故事告诉我们,简单的题也不能松懈!
2224. 转化时间需要的最少操作数:easy,贪心,官方解法和我一致
2225. 找出输掉零场或一场比赛的玩家:easy,哈希表,官方解法和我一致
2226. 每个小孩最多能分到多少糖果:对值的二分,可以参考前文的求上界的模板
2227. 加密解密字符串:不难,但是错误提交了两次。逆向思维!遍历字典 instead of 遍历输入。
第288场周赛 2022/04/10 Airwallex
比赛结束后虚拟竞赛的~
2231. 按奇偶性交换后的最大数字:送分
2232. 向表达式添加括号后的最小结果:送分,分别遍历左右括号的位置即可,需要细心想清楚边界。但是一开始没看清题意,只返回了int呜呜。
2233. K 次增加后的最大乘积:送分,贪心+堆。一定要注意题目让取模!而且循环内要取模,否则超时。
2234. 花园的最大总美丽值:前缀和+二分查找!是真的没有什么头绪,想了想dp感觉不可行,然后陷入沉思。悄悄看了官方题解的文字思路,然后自己写出来了!这道题蛮精彩的,不仅思路巧妙,而且边界也非常繁琐。值得回顾!
招商银行专场竞赛 2022/04/10
比赛链接
别人的题解
招商银行-01. 文本编辑程序设计:送分,搞清数组边界即可
招商银行-02. 公园规划:送分,抽屉问题
招商银行-03. 点燃木棒:BFS。审题很久才懂,挺麻烦的。容易错
招商银行-04. 商店促销活动:又是一道完全没有头绪的题。三维DP。好难好难好难。参考:https://www.bilibili.com/read/cv16080974
第 76 场双周赛 2022/04/16 中控技术
第 289 场周赛 2022/04/17 海康威视
比赛链接
2243. 计算字符串的数字和:送分。
2244. 完成所有任务需要的最少轮数:dp,like青蛙跳。
第290场周赛 2022/04/24 华为
2248. 多个数组求交集:送分。方法一:暴力搜索,时间O(n^2)
,空间O(1)
。方法二:哈希,时间O(n)
,空间O(n)
。
2249. 统计圆内格点数目:暴力 + 优化。复杂度:201 * 201* 200=8*10^6。优化方法1:x**2
改为 x*x
,见题解区;优化方法二:半径倒排。
2250. 统计包含每个点的矩形数目:最初的思路是:对于每个点的坐标,先二分找满足w >= w0
的w
,然后在这些矩形中二分找h >= h0
的。我以为复杂度是O(len(points) * log(len(rectangles) * log(len(rectangles))
,事实上no。因为在选取矩形的时候,搬移并sort了r_h
,所以复杂度是O(len(points) * log(len(rectangles) * len(rectangles)
,会超时。在看到其他题解后,找到了新思路,见链接。
第77场双周赛 2022/04/30 中信银行
比赛链接
第三题千辛万苦做出来,第四题实在放弃了。排名1200+,leetcode可真卷啊。
2255. 统计是给定字符串前缀的字符串数目:简单题,但需要考虑字符串长度<前缀的情况,否则指针越界呜呜。+5min预警!
2256. 最小平均差:思路也很容易想到,前缀和即可。
6053. 统计网格图中没有被保卫的格子数:多种遍历角度。一开始写超时了,一定要先想清楚复杂度再动手!
6054. 逃离火灾: 待填坑。对等待时间进行二分。
第291场周赛 2022/05/01 FunPlus
比赛链接
第三题卡住了,耽误了不少时间。好在努力之下,最后四道题都做出来了,但是排名只有600多呜呜。
6047. 移除指定数字得到的最大结果:模拟,生成移除后的字符串,保留最大的。时间复杂度为O(n)
6048. 必须拿起的最小连续卡牌数:方法1,滑窗法,保证窗口内没有重复元素,那么max(窗口+1)
即为答案,时间复杂度O(n)
,空间复杂度O(n)
。方法2,使用map(哈希表)记录每个数的索引位置,那么索引的最小差值+1即为答案,时间复杂度O(n),空间复杂度O(n)
6049. 含最多 K 个可整除元素的子数组:一开始审错题了,以为子数组不需要连续,想用回溯来做。后来悬崖勒马,改用滑窗法,不过时间复杂度竟然与暴力法一样呜呜呜。(填坑:评论区说的滚动哈希? )
6050. 字符串的总引力:非常精妙的题目,转换视角,遍历字符集!见简书
- 统计异或值在范围内的数对有多少
- 其他未整理
1248. 统计「优美子数组」
199. 二叉树的右视图