import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int maxSubArrayLengthTwo (int[] nums) {
// write code here
if(nums.length ==1){
return 1;
}
// 假设不允许断开的情况下,0-i 最大连续长度
int[] leftMaxSeq = new int[nums.length];
Arrays.fill(leftMaxSeq, 1);
for (int i = 0 ; i < leftMaxSeq.length-1 ; i++) {
if (nums[i] < nums[i + 1]) {
leftMaxSeq[i + 1] = leftMaxSeq[i]+1;
}
}
// 假设不允许断开的情况下,i-max 最大字串连续长度
int[] rightMaxSeq = new int[nums.length];
Arrays.fill(rightMaxSeq, 1);
for (int i = rightMaxSeq.length -1 ; i-1 > 0 ; i--) {
if (nums[i-1] < nums[i]) {
rightMaxSeq[i-1] =rightMaxSeq[i]+1;
}
}
int max = 1;
for(int i=0;i< nums.length ;i++){
max = Math.max(max,leftMaxSeq[i]);
}
// 0-i 的最大长度 --> i 到 max 的最大长度等于当前最大长度
for(int i=0;i< nums.length ;i++){
if(i == 0){
// System.out.print(rightMaxSeq[0]+","+i);
int temp = rightMaxSeq[1];
if(nums[1] >= 2 && nums[0] >= nums[1]){ // 说明可修正
temp++;
}
max = Math.max(max,temp);
continue;
}
if(i == nums.length -1){
int temp = leftMaxSeq[nums.length-2];
// System.out.print(rightMaxSeq[0]+","+i);
if(nums[nums.length-1] <= nums[nums.length-2] ){ // 说明可修正
temp++;
}
max = Math.max(max,temp);
continue;
}
if(nums[i+1] > nums[i-1] +1){ // 有修正空间
max = Math.max(max,leftMaxSeq[i-1]+rightMaxSeq[i+1]+1);
}
else { // 只有单边修正空间
int right = rightMaxSeq[i+1] ;
if(nums[i+1]>=2){ // 考虑向后最大字串,修改前面一个字符
right ++;
}
//System.out.print(leftMaxSeq[i-1]+","+i);
int temp = Math.max(leftMaxSeq[i-1]+1,right);
max = Math.max(max,temp);
}
}
return max;
}
}