形式一: i = j = 0
for (int i = 0, j = 0; i < n; i ++ )
{
while (j < i && check(i, j)) j ++ ;
// 具体问题的逻辑
}
常见问题分类:
(1) 对于一个序列,用两个指针维护一段区间
(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作
形式二: i = 0, j = n - 1
for (int i = 0, j = n - 1; i < n; i ++ )
{
while (j > i && check(i, j)) j --;
// 具体问题的逻辑
}
滑动窗口就是一个动态窗口,可以是固定长度,也可以是可变长度。
int left = 0;
for (int right = 0; right < n; right ++) {
while (check(left, right)) left ++;
if (check(left, right))
//具体逻辑
}
以右边界为基准,移动左边界。
注意:应该先根据题目条件处理将窗口进行扩大或者缩小,然后再用 if
执行对应逻辑,即先调整窗口大小,在使用窗口。