Leetcode: 354. Russian Doll Envelopes
Problem Statement
from typing import List
from bisect import bisect_left
class Solution:
def maxEnvelopes(self, envelopes: List[List[int]]) -> int:
N = len(envelopes)
envelopes.sort(key=lambda e: (e[1], -e[0]))
seq = []
for n, _ in envelopes:
k = bisect_left(seq, n)
if k == len(seq):
seq.append(n)
else:
seq[k] = n
return len(seq)
assert Solution().maxEnvelopes([[5, 4], [6, 4], [6, 7], [2, 3]]) == 3
assert Solution().maxEnvelopes([[1, 1], [1, 1], [1, 1]]) == 1
from typing import List
class FenwickTreeMax:
def __init__(self, n):
self.n = n
self.bit = [float("-inf")] * n
def getmax(self, r):
ret = float("-inf")
while r >= 0:
ret = max(ret, self.bit[r])
r = (r & (r + 1)) - 1
return ret
def update(self, idx, val):
while idx < self.n:
self.bit[idx] = max(self.bit[idx], val)
idx = idx | (idx + 1)
class Solution:
def maxEnvelopes(self, envelopes: List[List[int]]) -> int:
M = 123_456
best = FenwickTreeMax(M)
envelopes.sort(key=lambda e: (e[1], -e[0]))
ans = 0
for i in range(len(envelopes) - 1, -1, -1):
n = envelopes[i][0]
c = max(1, 1 + best.getmax(M - (n + 1)))
best.update(M - n, c)
ans = max(ans, c)
return ans
assert Solution().maxEnvelopes([[5, 4], [6, 4], [6, 7], [2, 3]]) == 3
assert Solution().maxEnvelopes([[1, 1], [1, 1], [1, 1]]) == 1