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  |