Leetcode: 302. Smallest Rectangle Enclosing Black Pixels

Problem Statement

from typing import List


class Solution:
    def minArea(self, image: List[List[str]], x: int, y: int) -> int:
        N = len(image)
        M = len(image[0])

        def first(lo, hi, chk):
            while lo < hi:
                m = lo + (hi - lo) // 2
                if chk(m):
                    hi = m
                else:
                    lo = m + 1
            return lo if chk(lo) else lo + 1

        l = first(0, y, lambda j: any(image[i][j] == "1" for i in range(N)))
        r = first(y, M - 1, lambda j: all(image[i][j] == "0" for i in range(N)))
        u = first(0, x, lambda i: "1" in image[i])
        d = first(x, N - 1, lambda i: "1" not in image[i])

        return (l - r) * (u - d)


assert (
    Solution().minArea(
        [["0", "0", "1", "0"], ["0", "1", "1", "0"], ["0", "1", "0", "0"]], 0, 2
    )
    == 6
)
assert Solution().minArea([["1"]], 0, 0) == 1