枚举,数学
668
2022.08.24
2024.02.25
发布于 未知归属地

枚举

将解空间缩小到允许的复杂度,然后枚举。

类别例题
单指针统计子串中的唯一字符数字1的个数统计子树中城市之间最大距离分成两个数组并最小化数组和的差
扫描线会议室 II
双指针
类别例题
滑动窗口三数之和Strange InequalityCubesBinary String
二分寻找两个正序数组的中位数树节点的第 K 个祖先超级次方
  • 换一种思路
    重新抽象问题、选择另外一种具象
类别例题
分析过程 -> 直接考虑结果的特点;计算每个查询的结果 -> 累计每个区间的结果Prof. SlimTypical Party in Dorm
逆向使数组K递增的最少操作次数加密解密字符串
  • 字符串匹配
    用于子串直接比较
类别例题
kmp多次搜索
滚动哈希(Rabin-Karp)/二进制掩码最长公共子路径猜字谜Magical Array
字典树维护异或和:1803. 统计异或值在范围内的数对有多少421. 数组中两个数的最大异或值1707. 与数组中元素的最大异或值;动态规划预处理:600. 不含连续1的非负整数

数学

用数学规律解决问题事半功倍,尝试列式子解决问题。

乘除

因子(质因子、最大公因数):
204. 计数质数1808. 好因子的最大数目
余数、奇偶性,进制,二进制:
AvtoBusZ mod X = C1017. 负二进制转换At Most 3

排列组合计数

统计理想数组的数目Max Min

随机/抽样

水塘抽样:398. 随机数索引
拒绝采样:470. 用 Rand7() 实现 Rand10()


204. 计数质数
枚举:枚举每个小于n的数x,检测x……存在重复计算,复杂度O(n*(n**0.5))
埃氏筛:枚举因子f,将f的倍数标记为质数(若f为质数),复杂度O(n*log log n)

Python
go
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为奇数时无解。

  • 求最大值,即让x尽量大,but how? 试试看:
    取x为n/4?那得要求n能被4整除,有余数时,比如余2(余1、余3的情况都已被“n不能为奇数”排除),可以将一辆4轮替换为6轮,结果不会变:n//4。
  • 求最小值同理,让y尽量大,考虑余数为0,2,4的情况。

别忘了n<4的情况,这样就包含了所有可能的情况。

评论 (0)