day 04 双指针 位运算

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

一个简单例子:

code.png

  1. 位运算

n>>k&1//n的二进制表示中第k位是几

x&-x//返回x的最后一位1的位置

简单例子:

code.png