class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums intvector 
     * @return int
     */
    int maxSubArrayLength(vector<int>& nums) {
        // write code here
        int n = nums.size();
        vector<int> heads(n, 1); //以i为头的最长递增子序列长度
        vector<int> tails(n, 1); //以i为尾的最长递增子序列长度
        for(int i = 1; i < n; i ++){
            if(nums[i] > nums[i - 1]) tails[i] = tails[i - 1] + 1;
        }
        for(int i = n - 2; i >= 0; i --){
            if(nums[i + 1] > nums[i]) heads[i] = heads[i + 1] + 1;
        }
        int ans = 1;
        for(int i = 0; i < n; i ++){
            ans = max({heads[i], tails[i], ans});
            if(i > 0 && nums[i - 1] >= nums[i]) ans = max(ans, tails[i - 1] + 1);
            if(i + 1 < n && nums[i] >= nums[i + 1] && nums[i] > 1) ans = max(ans, heads[i + 1] + 1); //需要改成一个正整数
            if(i + 1 < n && i - 1 >= 0 && nums[i + 1] - nums[i - 1] >= 2) ans = max(ans, heads[i + 1] + tails[i - 1] + 1);
        }
        return ans;
    }
};