动态规划,利用dp来保存到第i元素为止最大的上升子序列长度。首先对dp初始化,每个位置上的值初始化为1,即到每个元素为止至少有本身这样一个序列。在更新dp的过程中。例如更新dp[i]
遍历j令其等于0到i-1,如果nums[j]<nums[i],则加入第i个元素可以构成一个新的上升子序列,dp[i]=dp[j]+1。但是可能有很多的子序列可以和第i个元素构成上升子序列,我们需要选择上升子序列长度最长的长度作为第i个dp最终的值。具体更新公式如下:
dp[i]=max{dp[i], dp[j] + 1 for j in 0~i-1 and nums[j] < nums[i]}.
时间复杂度为n^2,第一层用来遍历需要更新的dp下标,第二层用来计算第i个dp的最终值
class Solution(object):
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dp = []
len_n = len(nums)
if len_n == 0:
return 0
for i in range(len_n):
dp.append(1)
for i in range(1, len_n):
for j in range(0, i):
if nums[j] < nums[i]:
temp = dp[j] + 1
if temp > dp[i]:
dp[i] = temp
else:
continue
return max(dp)