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

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

https://www.nowcoder.com/practice/78889543865f4aa380fa69e641ad9889

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int maxSubArrayLengthTwo (int[] nums) {
        if(nums.length <= 2){
            return nums.length;
        }
        int[] left = new int[nums.length];//左侧单调递增长度
        int[] right = new int[nums.length];//右侧单调递增长度
        int res = 0;
        left[0] = 1;
        right[nums.length - 1] = 1;
        for (int i = 1; i < nums.length; i++) {
            if(nums[i] > nums[i - 1]){
                left[i] = left[i - 1] + 1;
            }else {
                left[i] = 1;
            }
        }
        for (int i = nums.length - 2; i >= 0; i--) {
            if(nums[i] < nums[i + 1]){
                right[i] = right[i + 1] + 1;
            }else {
                right[i] = 1;
            }
        }
        for (int i = 0; i < nums.length; i++) {
            if(i == 0){//边界情况
                res = nums[1] == 1 ? Math.max(res,right[i]) : Math.max(res,right[i + 1] + 1);
                continue;
            }
            if(i == nums.length - 1){//边界情况
                res = nums[nums.length - 2] == (int)Math.pow(10,5) ? Math.max(res,left[i]) : Math.max(res,left[i - 1] + 1);
                continue;
            }
            if(nums[i + 1] - nums[i - 1] > 1){//两边可续上
                res = Math.max(res,left[i - 1] + right[i + 1] + 1);
            }else{//只能和其中一侧续上
                if(nums[i + 1] != 1 && nums[i - 1]!= (int)Math.pow(10,5)){//左右都能选
                    res = Math.max(res,Math.max(left[i - 1],right[i + 1]) + 1);
                }else if(nums[i + 1] == 1 && nums[i - 1]!= (int)Math.pow(10,5)){//只能选左侧
                    res = Math.max(res,left[i - 1] + 1);
                }else if(nums[i + 1] != 1 && nums[i - 1]== (int)Math.pow(10,5)){//只能选右侧
                    res = Math.max(res,right[i + 1] + 1);
                }else {//都选不了
                    res = Math.max(res,1);
                }
            }
        }
        return res;
    }
}

10的5次方和1都是边界,看了下大家都没考虑这个上边界呢,估计是用例不太全吧

全部评论

相关推荐

程序员小白条:你不是有一段实习了吗,现在找中大厂实习?过段时间要秋招了
我的简历长这样
点赞 评论 收藏
分享
牛客38347925...:9,2学生暑期实习失利开始投小厂,给这群人整自信了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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