题解 | 最长严格上升子数组(一)

最长严格上升子数组(一)

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;
    }
};

全部评论

相关推荐

程序员小白条:你是沟通了900个,不是投了900份简历,你能投900份,意味着对面都要回复你900次,你早就找到实习了,没亮点就是这样的,别局限地区,时间投的也要早,现在都要7月了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务