You have a number of envelopes with widths and heights given as a pair of integers (w, h)
. One envelope can fit into another if and only if both the width and height of one envelope is greater than the width and height of the other envelope.
What is the maximum number of envelopes can you Russian doll? (put one inside other)
Note:
Rotation is not allowed.
Example:
Input: [[5,4],[6,4],[6,7],[2,3]]
Output: 3
Explanation: The maximum number of envelopes you can Russian doll is 3
([2,3] => [5,4] => [6,7]).
--------------------------------------------------------------------------------
需要想明白两个问题:
1. 按x排序,x相同再y排序,求y的最长递增子序列,但是x相同的时候套娃套不进去
2. 按x排序,x相同再-y排序,求y的最长递增子序列,这样就避免了x相同时的套娃问题
代码如下:
class Solution:
def maxEnvelopes(self, envelopes) -> int:
envelopes.sort(key=lambda x:(x[0],-x[1]))
l, res = len(envelopes), 1
if (l == 0):
return 0
f = [-1]
for i in range(0, l):
size = len(f)
lo,hi,tgt = 0,size-1,envelopes[i][1]
while (lo <= hi):
mid = lo + ((hi-lo)>>1)
if (f[mid]<tgt):
lo = mid + 1
else:
hi = mid - 1
#index lo-1 is the last < y,index lo will be updated
if (lo < size):
f[lo] = min(tgt,f[lo])
else:
f.append(tgt)
return len(f)-1
s = Solution()
print(s.maxEnvelopes([[5,4],[6,4],[6,7],[2,3]]))