题解 | 信封嵌套
信封嵌套
https://www.nowcoder.com/practice/25fe1fc89c4c4e82bbc63df04bc6ca30
def maxEnvelopes(envelopes):
if not envelopes:
return 0
# 按照长度升序排列,如果长度相同则按照宽度降序排列
envelopes.sort(key=lambda x: (x[0], -x[1]))
# 提取宽度并寻找最长递增子序列
widths = [envelope[1] for envelope in envelopes]
dp = []
for width in widths:
# 使用二分查找找到第一个大于等于当前宽度的位置
left, right = 0, len(dp)
while left < right:
mid = (left + right) // 2
if dp[mid] >= width:
right = mid
else:
left = mid + 1
# 如果找到的位置等于 dp 的长度,说明当前宽度比所有元素都大,直接添加到末尾
if left == len(dp):
dp.append(width)
else:
# 否则替换掉第一个大于等于当前宽度的元素
dp[left] = width
return len(dp)
# 输入处理
n = int(input())
envelopes = []
for _ in range(n):
l, w = map(int, input().split())
envelopes.append((l, w))
# 输出结果
print(maxEnvelopes(envelopes))
海康威视公司福利 1182人发布