给定一个二维int的数组actors,每个元素对应两个值,分别代表一个演员的身高和体重。要求一个演员站在另一个演员的肩膀上叠起来,且上面的人要比下面的人轻,下面的人要比上面的人高。同时给定演员总数n,要求返回最多能叠的人数。保证总人数小于等于500。
测试样例:
[[1,2],[3,4],[5,6],[7,8]],4
返回:4
""" 求数组arr的最长递增子序列 创建一个列表res,res[i]用来存放以arr[i]结尾的最长递增子序列的长度 为了求出res[i],要将arr[i]与arr[j]比较,其中j=[0,i),而如果arr[j]<arr[i], arr[i]自然可以放在以arr[j]的后面,这时res[i]=res[j]+1,遍历所有的j,找到一个 可以让res[i]最大的值,这个值便是以arr[i]结尾的最长递增子序列的长度 """ def getMax(arr, n): dp = [1] * n for i in range(n): for j in range(i): if arr[i] > arr[j] and dp[j]+1 > dp[i]: dp[i] = dp[j] + 1 return max(dp) class Stack: """ 这道题可以先将列表按身高排序,然后求体重的最长递增子序列 """ def getHeight(self, actors, n): actors.sort() arr = [li[1] for li in actors] return getMax(arr, n)
# -*- coding:utf-8 -*- class Stack: def getHeight(self, actors, n): actors.sort() men = [weight for _, weight in actors] return self.getHeight1(men, n) def getHeight1(self, men, n): dp = [0] * n dp[0] = 1 bs = [0] * n bs[0] = men[0] # 在bs中找到第一个比x大的数并替换 def binary_search(x, end): i = 0 j = end while i <= j: mid = (i + j) / 2 if x > bs[mid]: i = mid + 1 else: j = mid - 1 end = max(end, i) bs[i] = x return i, end end = 0 # bs length for i in range(1, n): val, end = binary_search(men[i], end) dp[i] = val+1 return max(dp)