首页 > 试题广场 >

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

[编程题]最长严格上升子数组(一)
  • 热度指数:3262 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为n的正整数数组nums,可以任意改变数组的其中一个元素,改变的元素范围也在[1,100000]之内,然后返回nums的最长"严格上升"子数组的长度。
1.子数组是连续的,比如[1,3,5,7,9]的子数组有[1,3],[3,5,7]等等,但是[1,3,7]不是子数组
2.严格上升指在数组上任意位置都满足 nums[i] < nums[i+1],比如[1,2,2,3],其中[1,2,2]不是严格上升的子数组,[1,2]是的
数据范围:
要求: 空间复杂度 ,时间复杂度
示例1

输入

[7,2,3,1,5,6]

输出

5

说明

将1改为4,最长严格上升子数组为[2,3,4,5,6]      
示例2

输入

[1,2,3,4]

输出

4

说明

最长严格上升子数组为[1,2,3,4]      
示例3

输入

[1,2,2,3]

输出

3

说明

改变一个元素之后,最长严格上升子数组为[1,2,3]或者[2,3,4],长度都为3      
class Solution:
    def maxSubArrayLengthTwo(self , nums: List[int]) -> int:
        n = len(nums)
        dp_left = [1]*n     # 以nums[i]结尾
        dp_right = [1]*n    # 以nums[i]开头
        for i in range(1,n):    
            if nums[i]>nums[i-1]:
                dp_left[i] = dp_left[i-1]+1
        for i in range(n-2,-1,-1):
            if nums[i]<nums[i+1]:
                dp_right[i] = dp_right[i+1]+1
        # 更改nums[i],拼接
        res = 1
        for i in range(n):
            if i > 0 and i < n-1 and nums[i+1]-nums[i-1] > 1:   # 拼接左右
                res = max(res,dp_left[i-1]+dp_right[i+1]+1)
            else:
                if i>0:
                    res = max(res,dp_left[i-1]+1)               # 拼接在结尾
                if i<n-1 and nums[i+1]>1:
                    res = max(res,dp_right[i+1]+1)              # 拼接在开头
        return res

发表于 2025-01-15 14:39:23 回复(0)