问题:最长连续上升子序列长度,或者说最长连续单调子序列
代码及注释如下:
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]