题解 | 最长严格上升子数组(一)
最长严格上升子数组(一)
https://www.nowcoder.com/practice/78889543865f4aa380fa69e641ad9889
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; } };