自用双指针算法复习总结
作者:
白金之星
,
2021-09-04 22:35:50
,
所有人可见
,
阅读 344
双指针算法可以对双重循环暴力枚举求单调序列的最大连续子区间的问题进行优化
模板:
for(int i = 0, j = 0; i < n; i++)
{
while(j <= i && (不满足限制条件)) j++;
res = max(res, i - j + 1); // res存当前最大连续子区间长度,每次循环都更新res
}
其中i
用来枚举每一个右端点, j
为每一个i
所对应的满足限制条件的最小左端点,如果当前区间满足限制条件,则i
右移,若不满足条件则j
右移
模板中的限制条件一般由题目给出或者分析得到
例如: PAT甲级 1085 题,题目要求序列满足M <= m * p
其中M
为区间中最大的数,m
为区间中最小的数,p
为给定常数,则本题的模板为:
for(int i = 0, j = 0; i < n; i++)
{
while(j <= i && a[i] > a[j] * p) j++; // a[i]存下标i对应的元素值
res = max(res, i - j + 1);
}