https://leetcode-cn.com/probl...这道题用的很巧妙。lengthOfLIS函数请参考300最长的上升子序列这个函数的答案是从这个问题上复制过来的。这道题用了一个巧妙的方法来处理信封的顺序。信封按宽度升序排列,但当它们宽度相同时按高度降序排列。这是因为同样宽度的信封不能套娃娃,所以这时候如果按照高度降序排列,就不能使用同样宽度的信封了。由于在lengthOfLIS函数中只传入了高度信息,所以这种排序方式相当于将宽度信息传入了高度(将相同宽度的信封的高度倒序排序)。importbisectclass解决方案: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]returnlen(dp)defmaxEnvelopes(self,envelopes:List[List[int]])->int:如果不是信封:返回0envelopes.sort(key=lambdax:(x[0],-x[1]))returnself.lengthOfLIS([x[1]用于信封中的x])欢迎来到我的博客:https://codeplot.top/我的博客类别:https://codeplot.top/categories/%E5%88%B7%E9%A2%98/
