把循环指针 i 、j 称为「扫描指针」,在尺取法中,这两个指针 i、j,有两种扫描方向:
反向扫描。i、j 方向相反,i 从头到尾,j 从尾到头,在中间相会。也可以把反向扫描的 i、j 指针称为「左右指针」。
同向扫描。i、j方向相同,都从头到尾,但是速度不一样,比如可以让 j 跑在 i 前面。也可以把同向扫描的 i、j 指针称为「快慢指针」,此时由于 i 和 j 速度不同,i 和 j 之间在序列上产生了一个大小可变的「滑动窗口」,这是尺取法的优势,有灵活的应用。
注意,用尺取法的最关键之处在于,两个指针 i、j在总体上只能有一个循环,例如:i 循环一遍,对应的 j 只能跟随 i 循环一遍。这样才能实现计算复杂度从 O(n^2)到 O(n)的优化。
反向扫描尺取法
//用while实现:
int i = 0, j = n - 1;
while (i < j) { //i和j在中间相遇。这样做还能防止i、j越界
...... //满足题意的操作
i++; //i从头扫到尾
j--; //j从尾扫到头
}