Leetcode秋招指路
1. 数组
1.1 哈希表
1 | class Solution: |
1.2 滑动窗口
1.2.1 和大于等于target的最短子数组
1 | class Solution: |
1.2.2 乘积小于K的子数组
1 | class Solution: |
1.2.3 无重复字符的最长子串
1 | class Solution: |
1.3 双指针
可用来优化空间复杂度
1.3.1 乘最多水的容器
1 | class Solution: |
1.3.2 三数之和
1 | class Solution: |
1.4 二分查找
1.4.1 模板
满足条件的都写
l = mid
或者r = mid
。如果满足条件选择的是l = mid
,那么mid写成l + r + 1 >> 1
,否则写成l + r >> 1
。然后就是else的写法:l = mid
对应r = mid - 1
,r = mid
对应l = mid + 1
。
1 | # 找满足条件最左边的索引 |
1.4.2 求根号x的值
1 | # 二分查找 |
1.4.3 搜索旋转排序数组
1 | # 将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。 |
1.4.4 排序数组中只出现一次的数字
1 | class Solution: |
1.5 单调栈
1.5.1 模板
1 | class Solution: |
1.5.2 每日温度
1 | class Solution: |
1.5.3 小行星碰撞
1 | class Solution: |
1.5.4 直方图最大矩形面积
1 | class Solution: |
1.5.5 矩阵中最大的矩形
1 | class Solution: |
1.6 模拟
1.6.1 螺旋矩阵
1 | class Solution: |
1.6.2 缺失的第一个正数
1 | class Solution: |
1.6.3 旋转图像
1 | class Solution: |
1.6.4 所有子集
1 | class Solution: |
1.7 前缀和/哈希表
1.7.1 左右两边子数组的和相等
1 | class Solution: |
1.7.2 和为k的子数组
1 | # 以当前元素为末尾结合前缀和的思想寻找之前有多少个cur-k |
1.7.3 0和1个数相同的子数组
1 | # 由于「0 和 1 的数量相同」等价于「1 的数量减去 0 的数量等于 0」,我们可以将数组中的 0 视作 −1,则原问题转换成「求最长的连续子数组,其元素和为 0」。 |
1.7.4 最长连续序列
1 | class Solution: |
1.8 排序
1.8.1 快速排序
1 | class Solution: |
1.8.2 快速选择
1 | class Solution: |
1.8.3 值和下标之差都在给定的范围内
1 | # 维护一个大小为k的滑动窗口s1 |
2. 链表
2.1 合并K个升序链表
1 | class Solution: |
2.2 排序的循环链表
1 | """ |
2.3 快慢指针
2.3.1 定位
1 | # Definition for singly-linked list. |
1 | class Solution: |
1 | # Definition for singly-linked list. |
2.3.2 判断是否存在环
1 | # Definition for singly-linked list. |
3. 字符串
3.1 回文串
3.1.1 中心扩展法
1 | class Solution: |
3.1.2 Manacher
1 | class Solution: |
3.1.3 动态规划
1 | class Solution: |
3.2 子串匹配
3.2.1 KMP算法
暂略
3.3 模拟
3.3.1 电话号码的字母组合
1 | class Solution: |
3.4 滑动窗口
3.4.1 不含重复字符的最长子字符串
1 | # Solution 1 |
4. 堆
heapq.heappush(heap, item)
heapq.heappop(heap)
heapq.heapify(x)
heapq.nlargest(n, iterable, key=None)
heapq.nsmallest(n, iterable, key=None)
4.1 最小堆
4.1.1 寻找两个正序数组的中位数
1 | class Solution: |
4.1.2 和最小的k个数对
1 | from itertools import product |
5. 树
5.1 字典树/前缀树
5.1.1 模板
1 | class Trie: |
5.1.2 替换单词
1 | class Solution: |
5.1.3 最短的单词编码
1 | # 存储后缀 |
5.1.4 神奇的字典
1 | class Trie: |
5.1.5 最大的异或
1 | class Trie(): |
5.2 深度优先搜索DFS
5.2.1 从根节点到叶节点的路径数字之和
1 | # Definition for a binary tree node. |
5.2.2 所有大于等于节点的值之和
1 | # Definition for a binary tree node. |
5.2.3 节点之和的最大路径
1 | # Definition for a binary tree node. |
5.3 广度优先搜索BFS
5.3.1 二叉树的层次遍历
1 | class Solution: |
5.4 前缀和
5.4.1 向下的路径节点之和
1 | # Solution 1 DFS |
6. 深度优先搜索DFS
6.1 模板题
6.1.1 括号生成
1 | class Solution: |
6.1.2 岛屿的最大面积
1 | class Solution: |
6.2 回溯
6.2.1 允许重复选择元素的组合
1 | class Solution: |
6.2.2 含有重复元素集合的组合
1 | class Solution: |
6.2.3 没有重复元素集合的全排列
1 | class Solution: |
6.2.4 含有重复元素集合的全排列
1 | class Solution: |
6.2.5 分割回文子字符串
1 | class Solution: |
6.2.6 复原IP
1 | class Solution: |
6.3 二分图
6.3.1 模板题
1 | class Solution: |
7. 广度优先搜索BFS
7.1 模板题
7.1.1 矩阵中的距离
1 | class Solution: |
7.2.2 所有路径
1 | class Solution: |
7.2 拓扑排序
7.2.1 课程顺序
1 | class Solution: |
7.2.2 外星文字典
1 | class Solution: |
7.2.3 重建序列
1 | class Solution: |
8. 动态规划
8.1 例题
8.1.1 最大子数组和
1 | # 状态:以i结尾的最大子数组和 |
8.1.2 接雨水
1 | class Solution: |
8.1.3 通配符匹配
1 | class Solution: |
8.1.4 翻转字符
1 | class Solution: |
8.1.5 最长斐波那契数列
1 | class Solution: |
8.1.6 最少回文分割
1 | class Solution: |
8.1.7 字符串交织
1 | class Solution: |
8.1.8 最长公共子序列
1 | class Solution: |
8.1.9 最长递增子序列
1 | class Solution: |
8.1.10 分割等和子集
1 | class Solution: |
8.1.12 加减的目标值
1 | class Solution: |
8.1.13 最少的硬币数目
1 | class Solution: |
8.1.14 排列的数目
1 | class Solution: |
9. 图
9.1 并查集
9.1.1 省份数量
1 | class Solution: |
9.1.2 相似的字符串
1 | class Solution: |
9.1.3 多余的边
1 | class Solution: |
10. 位运算
10.1 快速幂
1 | class Solution: |
10.2 快速幂取余
1 | class Solution: |
附录(Python Trick)
a. int/bin
1 | # 将一个字符串类型的x视其为base进制,返回十进制结果 |
1 | # 返回x的二进制表示 |
b. any
1 | # any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True |
c. product
1 | # 返回A,B的笛卡尔积 |
d. reduce
1 | functools.reduce(function, iterable[, initializer]) |
e. ord/chr
1 | # ord 返回ASCII数值 |
f. find/rfind
1 | # find() 从头查找子串位置,找到返回索引,找不到返回-1 |
g. bisect_left/bisect_right
1 | # 若存在x,返回最左侧的索引;若不存在x,返回合适的插入位置使列表有序 |
h. combinations/permutations
1 | # [('a', 'b'), ('a', 'c'), ('b', 'c')] |
i. Counter
1 | from collections import Counter |
j. SortedList
1 | from sortedcontainers import SortedList |