zoukankan      html  css  js  c++  java
  • 牛牛的数列

    牛牛现在有一个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
    
    
  • 相关阅读:
    modifier key
    功能权限与数据权限的转换、功能权限的分散
    the relationship among AdapterFactory, Adapter, Adaptee and Viewer
    MANIFEST.MF
    eclipse plugin中开发的一些注意事项
    Why is it necessary for an interface to be "declared" abstract?
    防卫力量与公共安全:SAP与地理信息的集成
    SQL Server联机丛书:存储过程及其创建
    伤感的英文单词[转帖]
    ASP中得到当前页面完整URL的方法[转帖]
  • 原文地址:https://www.cnblogs.com/sandy-t/p/13563333.html
Copyright © 2011-2022 走看看