本文最后更新于 717 天前,其中的信息可能已经有所发展或是发生改变。
Original Link
思想:
- 双指针。
- 快指针
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
的区间。
代码:
| #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 ++; |
| res = max(res, i - j + 1); |
| t = a[i] - a[i - 1]; |
| i --; |
| } |
| } |
| cout << "Case #" << T << ": " << res << endl; |
| } |
| |
| int main(){ |
| int _; cin >> _; |
| for(int i = 1; i <= _; i ++) solve(i); |
| return 0; |
| } |