枚举
枚举的思想:将问题的所有可能的答案一一列举
枚举算法的一般步骤:
-
确定范围和枚举方式: 根据题目确定枚举的范围,并选择合适的枚举方式。确保不遗漏任何真正的解,同时避免重复。
-
优化解空间: 查看是否存在优化的可能性,以缩小可能成为解的答案范围,提高解决问题的效率。
-
定义准确验证条件: 根据问题找到准确、易编码的验证条件,用于检验每个可能的解。
-
枚举和判断: 逐一枚举解并验证是否符合事先确定的条件,保留符合条件的解。
-
输出结果: 按照要求输出枚举过程中留下的符合条件的解。
枚举法包含多种技巧和方法,本节课将深入探讨其中几种方法。
组合型枚举
组合型枚举是在 n 个元素中随机选出 m 个元素的问题。对于每一种可能的选择方案,我们需要确定选择了哪 m 个元素,这就是组合型枚举。
具体而言,组合型枚举解决的是 Cnm 问题,即从 n 个元素中选择 m 个元素的组合数量。
排列型枚举
全排列,可以采用permutations排列函数
尺取
尺取法(双指针法、two pointers)是一种常用的优化技巧,特别适用于解决序列的区间问题。它的操作简单,易于编程,是一种线性高效的算法。
尺取法的核心思想是维护一个区间(L,R),其中 L 为起点,R 为终点,该区间是序列内以 L 为起点的最短合法区间。关键在于 R 随着 L 的增大而增大。通过不断枚举 L,同时求解相应的 R,可以高效地解决问题。
具体的实现步骤是,不断移动 L 指针,同时更新 R 指针,直到 R 随着 L 的增大而增大。因为 R 随着 L 的增大而增大,所以总的时间复杂度为 O(n)。
通过维护两个指针,即左指针 l 和右指针 r。通过不断确定区间的左端点,让右指针 r 不断向右移动,直到满足条件停下,然后维护答案。这个过程重复进行,直到左指针 l 超过右指针 r 或满足其他特定情况(根据题目而定)。