牛牛的数列

牛牛现在有一个n个数组成的数列,牛牛现在想取一个连续的子序列,并且这个子序列还必须得满足:
最多只改变一个数,就可以使得这个连续的子序列是一个严格上升的子序列,牛牛想知道这个连续子序列最长的长度是多少。
输入描述:
    输入包括两行,第一行包括一个整数n(1 ≤ n ≤ 10^5),即数列的长度;
    第二行n个整数a_i, 表示数列中的每个数(1 ≤ a_i ≤ 10^9),以空格分割。

输出描述:
    输出一个整数,表示最长的长度。
    示例1
    输入:
    6 
    7 2 3 1 5 6
    输出:
    5

解题思路:
正着枚举记录一下当前位置的连续上升子序列长度,倒着也做一遍。
最后枚举一个连接点即可。
 
1)对于每一位置i 正向记录到i递增的长度pre[i]  (如果a[i]>a[i-1] 则pre[i] = pre[i-1] + 1否则等于1)
2)对于每一位置i 反向记录到i递减的长度suf[i]  (如果a[i]<a[i+1] ]则suf[i] = suf[i+1] + 1否则等于1)
3)针对每一要替换的位置i   比较当前ans  pre[i-1] suf [i+1] 中的最大值    
      对于a[i+1] -a[i-1]>=2   证明a[i]可替换   然后计算ans  和pre[i-1] + suf[i+1] +1中的最大值
 
注意a[0]   a[n+1] 均定义最大值,使得在比较时不会越界且不影响处理结果

nums=[7, 2, 3, 1, 5, 6]
def solver(nums):
    nums = [float('inf')] + nums + [-float('inf')]
    print(nums)
    pre = [0] * len(nums)
    for i in range(len(nums)):
        if i == 0:
            pre[i] = 1
        elif nums[i] > nums[i-1]:
            pre[i] = pre[i-1]+1
        else:
            pre[i] = 1

    suf = [0] * len(nums)
    for i in range(len(nums)-1,-1,-1):
        if i==len(nums)-1:
            suf[i] = 1
        elif nums[i]<nums[i+1]:
            suf[i] = suf[i+1]+1
        else:
            suf[i] = 1

    print(pre)
    print(suf)
    ans = 0
    for i in range(1,len(nums)-1):
        if nums[i+1] - nums[i-1]>=2:
            ans = max(ans, pre[i-1]+suf[i+1]+1)

    return ans

原文地址:https://www.cnblogs.com/sandy-t/p/13563333.html