首先,对输入的身高和体重进行处理,按身高升序、体重降序的方式进行排序,这样可以确保在相同身高的情况下,体重较重的人排在前面。然后,使用一个动态数组 d_tail 来记录当前可以叠罗汉的最长序列,初始时只包含第一个人的体重。接着,遍历排序后的每个人,对于每个人,检查他们的体重是否可以放在当前的叠罗汉序列的末尾,如果可以,则将他们的体重添加到序列末尾;否则,使用二分查找在序列中找到一个位置,使得该位置之前的所有人的体重都小于当前人的体重,并将当前人的体重放在这个位置。最后,返回 d_tail 的长度,即为最多能叠的人数。
时间复杂度: O(n log n)
空间复杂度: O(n)
class Solution:
def bestSeqAtIndex(self, height: List[int], weight: List[int]) -> int:
order_number=0
order_height = sorted(range(len(height)),key= lambda d:(height[d],-weight[d]))
d_tail=[weight[order_height[0]]]
for i in range(1,len(order_height)):
get_num = weight[order_height[i]]
if d_tail[-1] < get_num:
d_tail.append(get_num)
else:
pos = bisect.bisect_right(d_tail,get_num)
if d_tail[pos-1]!=get_num:
d_tail[pos] = get_num
return len(d_tail)