公众号:编程驿站
1. 前言
双指针搜索算法,常见的有左右双指针;快慢双指针;先后双指针以及多指针……其中还包括一类滑动指针。滑动指针也称为滑动窗口指针,其搜索实现即有灵性又透着优雅。
本文通过几个案例聊聊滑动指针。
2. 最长的 1
题目描述
给定一个由若干 0
和 1
组成的数组 A
,我们最多可以将 K 个值从 0 变成 1 。返回包含最长(连续)1
子数组的长度。
如 A = [1,1,1,0,0,0,1,1,1,1,0], K = 2
,则连续出现1
的最长长度为6
。
把最后一个0
和倒数第二个0
变成1
,即[1,1,1,0,0,1,1,1,1,1,1]
可得到最长连续1
的长度。
算法实现流程:
- 初始,
left
指针(左指针)指向最左边,right
指针(右指针)和left
指针同位置。相当于初始窗口紧闭状态。
-
right
指针不停地向右边移动不间断地扩大窗口。移动条件是right
指针指向的值为1
,如果right
指针所指向位置的值为0
,则查询是否还有把0
转换成1
的机会,有则通过把0
转换成1
后移动。否则,right
指针停止移动。 -
如下图所示,因
k=2
,可以将连续的两个0
转换为1
(红色表示0
已经转换为1
)。k
的值在整个遍历过程中需要保留,可以另创建计数器变量c
,计数已经使用过的0
转换为1
的次数。 -
-
当
right
指针停止移动后,意味着在原数列中找到了一段连续1
的子序列。用变量res
记录子序列的长度。Tips: 实际操作时,不需要真正把
0
变成1
。
-
此时,
right
指