经过分析发现和力扣的 42. 接雨水 非常像(觉得挺新奇的,特此记录下),只不过一个是计算容量,一个是计算宽度,直接借鉴前后缀两次遍历的思路,找出各个符合条件的队伍,最后选出最长的。
(代码随便写的,新手勿喷)
时间复杂度:O(n)
空间复杂度:O(n)
#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9+7;
int main(void)
{
int n;
cin >> n;
vector<int> a(n+3);
for (int i = 1; i <= n; i++)
cin >> a[i];
if (n <= 2)
{
cout << n;
return 0;
}
int ans = 2;
vector<int> pre_max(n+3), suf_max(n+3);
pre_max[1] = a[1];
for (int i = 2; i <= n; i++)
pre_max[i] = max(pre_max[i-1], a[i]);
suf_max[n] = a[n];
for (int i = n-1; i >= 1; i--)
suf_max[i] = max(suf_max[i+1], a[i]);
for (int lp = 0, rp = 0; rp <= n; rp++)
{
if (min(pre_max[rp], suf_max[rp]) > a[rp])
a[rp] = 1;
else
a[rp] = 0;
if (a[rp] == a[lp])
{
if (rp == n && a[lp] == 1)
{
ans = max(ans, rp - lp + 1 + 2);
break;
}
continue;
}
if (a[lp] == 1)
ans = max(ans, rp - lp + 2);
lp = rp;
}
cout << ans;
return 0;
}