https://leetcode-cn.com/probl...
这道题目用了巧妙的方法,关于 lengthOfLIS 函数可以参见 300. 最长上升子序列的解答 这个函数就是从这个题目中复制过来的。
本题目用了一个巧妙的方法处理信封顺序。信封的宽度是按升序排序,但是宽度相同时却按高度的降序排序。
这是因为宽度相同的信封无法套娃,所以这时把高度按降序排列,就无法利用同宽度的信封了。由于传入 lengthOfLIS 函数的只有高度信息,这种排序方法相当于把宽度信息传递到高度中了(通过把同宽度的信封高度按逆序排列)。
import bisect
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
dp = []
for i in range(len(nums)):
idx = bisect.bisect_left(dp, nums[i])
if idx == len(dp):
dp.append(nums[i])
else:
dp[idx] = nums[i]
return len(dp)
def maxEnvelopes(self, envelopes: List[List[int]]) -> int:
if not envelopes:
return 0
envelopes.sort(key=lambda x:(x[0], -x[1]))
return self.lengthOfLIS([x[1] for x in envelopes])
欢迎来我的博客: https://codeplot.top/
我的博客刷题分类:https://codeplot.top/categories/%E5%88%B7%E9%A2%98/
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。