Skip to content

Latest commit

 

History

History
42 lines (32 loc) · 1011 Bytes

双指针.md

File metadata and controls

42 lines (32 loc) · 1011 Bytes

双指针

形式一: 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 执行对应逻辑,即先调整窗口大小,在使用窗口。