class Solution {
public:
int maxSubArrayLengthTwo(vector<int>& nums) {
// 遍历每一个元素,向前以及向后检验,得以当前为断点得最长;
// 或者,记录前一个序列的后端,和长度,以及后一个序列的前段和长度,遇到断点就更新;
// 改成使用数组记录,减去麻烦,用两个数组,一个记录以nums[i]结尾的最大子数组,一个记录以nums[i]开始的最大子数组;
int n = nums.size();
if(n == 1)return 1;
if(n == 2)return 2;
vector<int> incL(n, 1);
vector<int> incR(n, 1);
for(int i=1; i<n; ++i){ //从前往后遍历
if(nums[i] > nums[i-1]){
incL[i] = incL[i-1] +1;
}
}
for(int i=n-2; i>=0; --i){ //从后往前遍历
if(nums[i] < nums[i+1]){
incR[i] = incR[i+1] +1;
}
}
int maxLen = *max_element(incL.begin(), incL.end());
if(nums[1] >1){ maxLen = max(maxLen, 1+incR[1]);} //处理边界条件,特别的当对右数组加1时,因为题目要求元素正,所以小得不能为0;
maxLen = max( maxLen, incL[n-2]+1);
for(int i=1; i<n-1; ++i){
if(nums[i-1] < nums[i+1]-1){
maxLen = max(maxLen, incL[i-1]+ 1 +incR[i+1]);
}else{
if(nums[i+1] >1)maxLen = max(maxLen, incR[i+1]+1);
maxLen = max(maxLen,incL[i+1]+1);
}
}
return maxLen;
}
};