https://leetcode-cn.com/probl...这道题O(n^2)带暴力。保存序列尾部元素的思路可以优化为O(nlogn)暴力O(n^2)类解决方案:deflengthOfLIS(self,nums:List[int])->int:ifnotnums:return0dp=[1]*len(nums)foriinrange(1,len(nums)):forjinrange(0,i):ifnums[i]>nums[j]:dp[i]=max(dp[i],dp[j]+1)returnmax(dp)保存每个长度序列的尾元素tail[i]表示长度为i+1的子序列的最后一个元素,最小的可能的数量。理解tail数组的更新:如果当前数大于tail的最后一位,那么tail的长度可以加1,新的最长序列的尾元素自然就是当前数。如果当前数不大于,虽然不能扩展最长序列,但是,减少前一个尾元素的大小是可能的。您可以找到第一个大于此数字的尾部元素并替换它。第一种写法还是O(n^2)class解:deflengthOfLIS(self,nums:List[int])->int:ifnotnums:return0tail=[0]*len(nums)tail[0]=nums[0]max_l=0foriinrange(1,len(nums)):ifnums[i]>tail[max_l]:tail[max_l+1]=nums[i]max_l+=1else:forjinrange(max_l,-1,-1):ifnums[i]>tail[j]:breakiftail[j]
