题目:
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。
输入描述:
输入包括两行,第一行包括一个整数n(1 ≤ n ≤ 10^5),即数列的长度; 第二行n个整数a_i, 表示数列中的每个数(1 ≤ a_i ≤ 10^9),以空格分割。输出描述:
输出一个整数,表示最长的长度。示例1
输入
复制
6 7 2 3 1 5 6输出
复制
5
分析:
因为是连续,所以我们只需要考虑修改一个和不修改这两种区别。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n;
int a[N];
int l[N], r[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
for (int i = 1; i <= n; i ++ )
if (a[i] > a[i - 1]) l[i] = l[i - 1] + 1;
else l[i] = 1;
for (int i = n; i >= 1; i -- )
if (a[i] < a[i + 1]) r[i] = r[i + 1] + 1;
else r[i] = 1;
int mx = 1;
// for (int i = 1; i <= n ;i ++ ) cout << l[i] << " ";
// cout << endl;
for (int i = 1; i <= n ;i ++ ) \
{
if (a[i + 1] - a[i - 1] >= 2)
mx = max(mx, l[i - 1] + r[i + 1] + 1);
mx = max(mx, max(l[i], r[i]));
}
cout << mx << endl;
}