排序后求最长上升子序列
注意对\(y\)值从大到小排序可以保证相同\(x\)只取一个\(y\)
class Solution:
def maxEnvelopes(self, envelopes: List[List[int]]) -> int:
envelopes.sort(key=lambda x:(x[0], - x[1]))
# print(envelopes)
dp, n = [], len(envelopes)
for i in range(n):
if i == 0 or envelopes[i][1] > dp[-1]: dp.append(envelopes[i][1])
else:
l, r = 0, len(dp)
while l < r:
mid = (l + r) // 2
if dp[mid] >= envelopes[i][1]: r = mid
else: l = mid + 1
dp[l] = envelopes[i][1]
return len(dp)