当前位置: 首页 > 后端技术 > Python

Leetcode300.最长递增子序列

时间:2023-03-26 17:38:14 Python

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]int:ifnotnums:return0tail=[0]*len(nums)tail[0]=nums[0]max_l=0foriinrange(1,len(nums)):ifnums[i]&g吨;tail[max_l]:tail[max_l+1]=nums[i]max_l+=1else:idx=bisect.bisect_left(tail[:max_l],nums[i])#对分二分搜索tail[idx]=nums[i]returnmax_l+1354题也是用这个算法,354题官方解法简化代码导入bisectclass解法:deflengthOfLIS(self,nums:List[int])->int:dp=[]foriinrange(len(nums)):idx=bisect.bisect_left(dp,nums[i])如果idx==len(dp):dp.append(nums[i])否则:dp[idx]=nums[i]返回len(dp)更优雅相关话题Leetcode-354-俄罗斯套娃信封题本题使用本题的lengthOfLIS算法。欢迎来到我的博客:https://codeplot.top/我的博客分类:https://codeplot.top/categories/%E5%88%B7%E9%A2%98/