Leetcode: 1235. Maximum Profit in Job Scheduling

Problem Statement

from typing import List
from bisect import bisect_left


class Solution:
    def jobScheduling(
        self, startTime: List[int], endTime: List[int], profit: List[int]
    ) -> int:
        N = len(startTime)
        s = []
        e = []
        p = []
        for a, b, c in sorted(zip(startTime, endTime, profit)):
            s.append(a)
            e.append(b)
            p.append(c)

        dp = [0] * (N + 1)
        for i in range(N - 1, -1, -1):
            dp[i] = max(dp[i + 1], p[i] + dp[bisect_left(s, e[i], lo=i + 1)])

        return dp[0]


assert Solution().jobScheduling([1, 2, 3, 3], [3, 4, 5, 6], [50, 10, 40, 70]) == 120
assert (
    Solution().jobScheduling([1, 2, 3, 4, 6], [3, 5, 10, 6, 9], [20, 20, 100, 70, 60])
    == 150
)
assert Solution().jobScheduling([1, 1, 1], [2, 3, 4], [5, 6, 4]) == 6