- 双指针
- 第一类双指针:两个指针分别在两个序列中。这种情况下,我们可以使用两个指针分别遍历两个序列,并根据题目要求进行比较或操作。
- 初始化两个指针,分别指向两个序列的起始位置。
- 使用循环遍历序列,直到其中一个指针到达序列的末尾。
- 在每一次循环迭代中,根据题目要求,进行比较或操作,并根据结果移动指针。
- 继续执行循环直到完成所有操作。
- 第二类双指针:第二类双指针:两个指针在同一个序列内。这种情况下,我们可以使用两个指针在同一个序列内以不同的速度移动,以实现特定的目标。
- 初始化两个指针,一个指针称为快指针,另一个指针称为慢指针,它们都指向序列的起始位置。
- 使用循环遍历序列,直到快指针到达序列的末尾。
- 在每一次循环迭代中,根据题目要求,进行比较或操作,并根据结果移动指针。
- 继续执行循环直到完成所有操作。
- 核心思想:虽然是两个循环扫描,但是算法时间复杂度为O(n)
- 基本模板:
- 第一类双指针:两个指针分别在两个序列中。这种情况下,我们可以使用两个指针分别遍历两个序列,并根据题目要求进行比较或操作。
for(int i=0,j=0;i<n;i++)
{
while(j<i&&check(i,j))j++;
//每道题的具体实现
}
一个简单例子:
- 位运算
n>>k&1//n的二进制表示中第k位是几
x&-x//返回x的最后一位1的位置
简单例子: