题目难度: 中等
原题链接
今天继续更新程序员面试金典系列, 大家在公众号 算法精选 里回复 面试金典 就能看到该系列当前连载的所有文章了, 记得关注哦~
有个马戏团正在设计叠罗汉的表演节目,一个人要站在另一人的肩膀上。出于实际和美观的考虑,在上面的人要比下面的人矮一点且轻一点。已知马戏团每个人的身高和体重,请编写代码计算叠罗汉最多能叠几个人。
class Solution:
def bestSeqAtIndex(self, height: List[int], weight: List[int]) -> int:
# 固定维度a升序排列, 然后相同时维度b逆序排列, 这样只需要对b求最长递增子序列即可
# 因为a相同的时候b逆序, 递增序列最多只可能选择其中的一个b, 所以最终递增序列中一定不可能出现某两个a相同的情况
# 构造(身高,体重)元组列表
tuples = []
for h, w in zip(height, weight):
tuples.append((h, w))
# 身高升序, 体重降序排列
tuples.sort(key=lambda t: (t[0], -t[1]))
weights = [t[1] for t in tuples]
# 有序列表
sarr = []
for w in weights:
# j是列表中大于等于w的最小下标 (可能等于列表长度)
j = bisect.bisect_left(sarr, w)
if j >= len(sarr):
# w比任意已有数字都大, 追加它
sarr.append(w)
else:
# 否则更新对应下标的数字为w, 因为w总小于等于当前值
sarr[j] = w
# 最后有序列表的长度即为整个列表最长的递增子序列长度了
return len(sarr)
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家扫码关注~