最长算术
思想:
- 双指针。
- 快指针
i作为某一连续区间的右端点,慢指针j作为该区间的左端点。 - 初始化设差值为
t = a[1] - a[0],当a[i] - a[i - 1] == t时更新区间。 - 更新区间时,
i不断右移,直到不满足a[i] - a[i - 1] == t为止,此时维护最长连续区间的值res。 - 更新完毕后,还需要更新
t = a[i] - a[i - 1],再将i--还原,重新寻找新的差值为t的区间。
- 快指针
代码:
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 3;
int a[N];
void solve(int T) {
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> a[i];
int res = 0;
int t = a[1] - a[0];
for (int i = 1, j = 0; i < n; i++) {
if (a[i] - a[i - 1] == t) {
j = i; //标记左端点
while (a[i] - a[i - 1] == t && i < n) i++; //满足相邻差值相等则 i 右移
res = max(res, i - j + 1); //更新最长的连续区间
t = a[i] - a[i - 1]; //更新为新的差值 t
i--; //还原 i,防止漏查更新后的首个区间
}
}
cout << "Case #" << T << ": " << res << endl;
}
int main() {
int T;
cin >> T;
for (int i = 1; i <= T; i++) solve(i);
return 0;
}