354. 俄罗斯套娃信封问题
Difficulty
Hard
Tags
动态规划
URL
https://leetcode.cn/problems/russian-doll-envelopes/
Star
给你一个二维整数数组
envelopes
,其中 envelopes[i] = [wi, hi]
,表示第 i
个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。
请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。
注意:不允许旋转信封。
示例 1:
输入:envelopes = [[5,4],[6,4],[6,7],[2,3]] 输出:3 解释:最多信封的个数为3, 组合为:[2,3] => [5,4] => [6,7]。
示例 2:
输入:envelopes = [[1,1],[1,1],[1,1]] 输出:1
提示:
1 <= envelopes.length <= 10
5
envelopes[i].length == 2
1 <= w
i
, h
i
<= 10
5
法1 动态规划
思路
排序后,其实就是最长递增子序列 300. 最长递增子序列
题解
class Solution: def maxEnvelopes(self, envelopes: List[List[int]]) -> int: envelopes.sort(key=lambda x:[x[0], -x[1]]) nums = [e[1] for e in envelopes] return self.lcn(nums) def lcn(self, nums): dp = [1 for _ in nums] d = [nums[0]] for i in range(1, len(nums)): if nums[i] > d[-1]: d.append(nums[i]) dp[i] = len(d) else: # 找 小于 num[i]的最大值 l, r = 0, len(d)-1 while l <= r: m = l + (r - l) // 2 if d[m] < nums[i]: l = m + 1 else: r = m - 1 loc = r + 1 d[loc] = nums[i] dp[i] = loc + 1 return len(d)