将解空间缩小到允许的复杂度,然后枚举。
| 类别 | 例题 |
|---|---|
| 单指针 | 统计子串中的唯一字符,数字1的个数,统计子树中城市之间最大距离,分成两个数组并最小化数组和的差 |
| 扫描线 | 会议室 II |
| 双指针 |
| 类别 | 例题 |
|---|---|
| 滑动窗口 | 三数之和,Strange Inequality,Cubes,Binary String |
| 二分 | 寻找两个正序数组的中位数,树节点的第 K 个祖先,超级次方 |
| 类别 | 例题 |
|---|---|
| 分析过程 -> 直接考虑结果的特点;计算每个查询的结果 -> 累计每个区间的结果 | Prof. Slim,Typical Party in Dorm |
| 逆向 | 使数组K递增的最少操作次数,加密解密字符串 |
| 类别 | 例题 |
|---|---|
| kmp | 多次搜索 |
| 滚动哈希(Rabin-Karp)/二进制掩码 | 最长公共子路径,猜字谜,Magical Array |
| 字典树 | 维护异或和:1803. 统计异或值在范围内的数对有多少,421. 数组中两个数的最大异或值,1707. 与数组中元素的最大异或值;动态规划预处理:600. 不含连续1的非负整数 |
用数学规律解决问题事半功倍,尝试列式子解决问题。
因子(质因子、最大公因数):
204. 计数质数,1808. 好因子的最大数目
余数、奇偶性,进制,二进制:
AvtoBus,Z mod X = C;1017. 负二进制转换,At Most 3
水塘抽样:398. 随机数索引
拒绝采样:470. 用 Rand7() 实现 Rand10()
204. 计数质数
枚举:枚举每个小于n的数x,检测x……存在重复计算,复杂度O(n*(n**0.5))
埃氏筛:枚举因子f,将f的倍数标记为质数(若f为质数),复杂度O(n*log log n)
class Solution:
def countPrimes(self, n: int) -> int:
if n<3:return 0
isP=[0,0]+[1]*(n-2)
for f in range(2,int(n**0.5)+1):
if isP[f]==0:continue
# 对于当前f之前的质数、f作为倍数时,已经对2*f,3*f,…(f-1)*f进行了标记,所以倍数不需要从2开始,而是从f开始
for mf in range(f*f,n,f):
isP[mf]=0
return sum(isP)AvtoBus
设4轮和6轮bus数量分别为x,y,则n=4*x+6*y,
4*x+6*y为偶数,那么显然n为奇数时无解。
别忘了n<4的情况,这样就包含了所有可能的情况。