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