class Solution:
def bestSeqAtIndex(self, height: List[int], weight: List[int]) -> int:
# 类似俄罗斯套娃 实质: 求最长递增子序列
a = list(zip(height,weight))
# 排序:高度升序,重量降序
a = sorted(a,key = lambda x:(x[0],-x[1]))
# a[0][1] 为 第一个 升序的数值
dp = [a[0][1]]
# 使用二分查找,找寻当前比较小的元素所插在的位置
for i in range(1,len(a)):
wei = a[i][1]
if wei > dp[-1]:
# 大于就加在后面
dp.append(wei)
else:
# 小于则调用二分查找,找到第一个大于weight的位置替换为weight
left = 0
right = len(dp)
while left < right:
mid = left + (right-left)//2
if dp[mid]>=wei:
right = mid
elif dp[mid]<wei:
left = mid + 1
dp[left] = wei
return len(dp)
每日一道Leetcode - 面试题 17.08. 马戏团人塔【动态规划|最长递增序列系列】
最新推荐文章于 2023-09-20 10:46:43 发布