354. 俄罗斯套娃信封问题
354. 俄罗斯套娃信封问题
难度:困难
相关标签:数组、排序、贪心、二分查找
相关企业:-
题目描述:
给你一个二维整数数组 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
一、Python 最优解法(贪心+二分)完整代码
from bisect import bisect_left
from typing import List
class Solution:
def maxEnvelopes(self, envelopes: List[List[int]]) -> int:
# 核心排序:宽度升序,同宽度高度降序
envelopes.sort(key=lambda x: (x[0], -x[1]))
# 贪心+二分的核心辅助数组
tails = []
# 遍历排好序的每个信封,只看高度
for _, h in envelopes:
# 二分查找第一个≥h的索引
idx = bisect_left(tails, h)
# 扩展或替换
if idx == len(tails):
tails.append(h)
else:
tails[idx] = h
# tails长度即为最大嵌套数
return len(tails)
# 简单测试
if __name__ == "__main__":
print(Solution().maxEnvelopes([[5,4],[6,4],[6,7

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



