牛牛现在有一个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