2332. The Latest Time to Catch a Bus

Question

CleanShot 2024-09-18 at 13.30.32.png

Code

class Solution:
    def latestTimeCatchTheBus(self, buses: List[int], passengers: List[int], capacity: int) -> int:
        
        B, P = len(buses), len(passengers)
        buses.sort()
        passengers.sort()

        def canGetOn(time):

            p = 0

            for b in range(B):
                cur = 0

                # current passenger is the next in line
                while p < P and time > passengers[p] and cur < capacity and passengers[p] <= buses[b]:
                    p += 1
                    cur += 1
                
                if cur == capacity:
                    continue

                if time <= buses[b]:
                    return True

                b += 1
            
            return False

        
        l, r = 0, 10 ** 9 + 1

        while l <= r:
            m = l + (r - l) // 2

            if canGetOn(m):
                if not canGetOn(m + 1):
                    l = m
                    break
                l = m + 1
            else:
                r = m - 1

        seen = set(passengers)

        while l in seen:
            l -= 1

        return l