对于一个数字序列,请设计一个复杂度为O(nlogn)的算法,返回该序列的最长上升子序列的长度,这里的子序列定义为这样一个序列U1,U2...,其中Ui < Ui+1,且A[Ui] < A[Ui+1]。
给定一个数字序列A及序列的长度n,请返回最长上升子序列的长度。
测试样例:
[2,1,4,3,1,5,6],7
返回:4
# -*- coding:utf-8 -*- import bisect #二分搜索模块 class AscentSequence: def findLongest(self, A, n): res=[] for i in A: pos=bisect.bisect_left(res,i)#在res中查找i,i存在时返回i左侧的位置,i不存在返回应该插入的位置 if pos==len(res): #如果当前数比res中最后一个数还大,直接添加 res.append(i) else: #否则,找到替换位置替换原来的数 res[pos]=i return len(res)
# -*- coding:utf-8 -*- class AscentSequence: def findLongest(self, A, n): out=[[A[0]]] max_out=[A[0]] for i in range(1,len(A)): if max_out[-1]<=A[i]: out.append(max_out+[A[i]]) max_out=out[-1] else: l=0 flag=0 for j in range(i - 1, -1, -1): if out[j][-1]<=A[i]: if l==0: out.append(out[j] + [A[i]]) l = len(out[-1]) flag = 1 elif l<=len(out[j]+[A[i]]): l=len(out[j]+[A[i]]) out.pop(-1) out.append(out[j]+[A[i]]) flag=1 if flag==0: out.append([A[i]]) if len(max_out) <= len(out[-1]): max_out = out[-1] return len(max_out)