题目描述
牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。
输入描述:
输入包括两行,第一行包括一个整数n(1 ≤ n ≤ 10^5),即数列的长度;
第二行n个整数a_i, 表示数列中的每个数(1 ≤ a_i ≤ 10^9),以空格分割。
输入:
输出:
解决代码:
import java.util.Scanner;
public class Main {
public static int maxArr(int[] arr){
int n=arr.length;
int[] left=new int[n];
int[] right=new int[n];
left[0]=1;
//left数组表示从左开始,各个元素的最大递增子序列数
for(int i=0;i<n-1;i++){
if(arr[i+1]>arr[i]){
left[i+1]=left[i]+1;
}else{
left[i+1]=1;
}
}
right[n-1]=1;
//right数组表示从右开始,各个元素的最大递减子序列数
for(int i=n-1;i>0;i--){
if(arr[i-1]<arr[i]){
right[i-1]=right[i]+1;
}else{
right[i-1]=1;
}
}
int max=0;
for(int j=1;j<n-1;j++){
int a=left[j-1];
int b=right[j+1];
if(arr[j-1]<arr[j+1] && a+b>max){
max=a+b;
}
}
return max+1;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=sc.nextInt();
}
//输出结果
System.out.println(maxArr(arr));
}
}