题目:300.最长上升子序列
描述:
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是4。
一:利用递归实现最长上升子序列
import time
import random
##### init 300.最长上升子序列 ########
def lts(input):
result = 0
for index in range(len(input)):
result = max(result,f(input,index))
return result
def f(input,index):
res = 1
for j in range(len(input)):
if j< index and input[j]< input[index]:
res = max(res, f(input,j)+1)
return res
##### init 300.最长上升子序列 :自顶向下(记忆化) ########
def lts_dp(input):
result = 0
dp = [-1 for i in range(len(input))]
for index in range(len(input)):
result = max(result,f_dp(input,index,dp))
return result
def f_dp(input,index,dp):
if dp[index] != -1:
# print(dp[index])
return dp[index]
res = 1
for j in range(len(input)):
if j < index and input[j] < input[index]:
res = max(res, f_dp(input, j,dp) + 1)
dp[index] = res
return dp[index]
if __name__ == "__main__":
input = [random.randint(0,100) for i in range(100)]
starttime = time.time()
res = lts_dp(input)
endtime = time.time()
seconds = (endtime-starttime)
print(res,seconds)
starttime = time.time()
res = lts(input)
endtime = time.time()
seconds = (endtime - starttime)*1000
print(res, seconds)
两者的时间对比,利用记忆法可以使得整体的效率提升很多,如下打印的时间所示。
19 0.010025739669799805
19 133610.21614074707