
解法1,复杂度O(n)
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
# 解法1,复杂度O(n)
# 定义dp[]是以第i个元素结尾得最长字串长度,则答案就是dp中最大的那个数,转移方程为dp[i] =max(dp[i],dp[j]+1) if nums[j]<nums[i] j=0...i
# 含义就是前面的看第i个可以加到前面的子序列后面不(大于前面的就可以加上去,然后序列长度+1),因为可能第i个数可以加在好几个后面,所以取最大
dp=[]
for i in range(len(nums)):
dp.append(1)
for j in range(i):
if nums[j]<nums[i]:
dp[i] =max(dp[i],dp[j]+1)
return max(dp)
解法2,复杂度O(nln(n))
from bisect import bisect_left
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
# 解法2,复杂度O(nln(n))
'''
相当于维护一个结果数组,如果当前元素比结果数组的值都大的的话,就追加在结果数组后面(相当于递增序列长度加了1)保证是个有序数组;否则的话用
当前元素覆盖掉第一个比它大的元素(这样做的话后续递增序列才有可能更长,即使并没有更长,这个覆盖操作也并没有副作用哈,当然这个覆盖操作
可能会让最终的结果数组值并不是最终的递增序列值,这无所谓)
'''
res= []
length = 0
for number in nums:
index = bisect_left(res,number) # https://blog.csdn.net/qq_43657442/article/details/109486471
if index==length:
res.append(number)
length += 1
else:
res[index] = number
return length