russian doll

Go Here

这道题和longest increasing sub-sequence 几乎一样,仅仅需要一开始做一次排序,以及一个特殊顺序处理,comments里会提到。

上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import bisect
class :
def maxEnvelopes(self, envelopes):
"""
:type envelopes: List[List[int]]
:rtype: int
"""
if not envelopes:
return 0
l = len(envelopes)
if l == 1:
return 1

envelopes.sort(key=lambda c:(c[0], -c[1]))
# 此时再通过对长度做longest increasing sub-sequence就能求出解
return self.lis(list(map(lambda c: c[1], envelopes)))

def lis(self, arr):
q = []
for i in arr:
pos = bisect.bisect_left(q, i)
if len(q) == pos:
q.append(i)
else:
q[pos] = i
return len(q)