时间复杂度O(n),空间复杂度O(n)
[C++ 代码]
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int maxSubArrayLengthTwo(vector<int>& nums) {
int n = nums.size();
// 1. 分别计算以当前元素为结尾和为开始的最长严格上升子数组
vector<int> end(n);
vector<int> start(n);
end[0] = 1;
for(int i=1; i<n; ++i) end[i] = (nums[i]>nums[i-1] ? end[i-1]+1 : 1);
start[n-1] = 1;
for(int i=n-2; i>=0; --i) start[i] = (nums[i]<nums[i+1] ? start[i+1]+1 : 1);
int res = 1;
for(int i=0; i<n; ++i){
// 如果非首尾元素且满足前一个元素比后一个元素至少小2,说明可以改变当前元素承上启下
if(i>0 && i<(n-1) && nums[i-1]+1 < nums[i+1]) res = max(res, 1+end[i-1]+start[i+1]);
else{
// 启下:元素不能是最后一个,且后一个元素不能是最小值
if(i<(n-1) && nums[i+1]>1) res = max(res, 1+start[i+1]);
// 承上:元素不能是第一个,且前一个元素不能是最大值
if(i>0 && nums[i-1]<1e5) res = max(res, 1+end[i-1]);
}
}
return res;
}
};

京公网安备 11010502036488号