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]

猜你喜欢

转载自blog.csdn.net/lerry13579/article/details/83862948
今日推荐