dp基础坐标型问题之最长单调子序列

问题:最长连续上升子序列长度,或者说最长连续单调子序列

 

代码及注释如下:

def get_length(A):
    #f[i]表示以A[i]结尾的最长上升子序列的长度
    n = len(A)
    #最终结果
    res = 0
    if  n==0:
        return 0
    f = [0 for x in range(n)]
    for i in range(n):
        #初始f[0] = 1
        f[i]  = 1
        #子序列长度超过1并且后面的数字大于前面的数字
        if i>0 and A[i-1]<A[i]:
            f[i] = f[i-1]+1
        #如果找到比之前的最长长度还大,则更新最长长度
        if f[i]>res:
            res = f[i]
    return res

A = [5,1,6,3,4]
print(get_length(A))
#若是单调的话,只需把A反转后再算一遍,最后取两者最大值

print(max(get_length(A),get_length(A0)))

结果是2

 

注:

一:

A=[5,1,6,4,3]

#python列表反转

#分片
A0 = A[::-1]

#内建函数sorted()
#sorted(iterable[, cmp[, key[, reverse]]])
A1 = sorted(a,reverse=True)

#内建函数reversed
A2 = list(reversed(A))

二:

本问题时间复杂度为O(n),空间复杂度为O(n)

还可以对空间优化达到O(1)

因为再求最大长度时,只有f[i]和f[i-1]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值