LeetCode1235 规划兼职工作

LeetCode1235 规划兼职工作

  • 按照结束时间进行排序
  • \(f[i]\)表示前\(i\)个工作的最大报酬, 第\(i\)个工作可选可不选
  • \(i\)个不拿: \(f[i] = max(f[i], f[i - 1])\)
  • \(i\)个拿: \(f[i] = max(f[i], f[j] + profit[i])\), 其中\(j\)表示满足\(starTime[i] \ge endTime[j]\)最右的\(j\), 可以通过在排序的\(endTime\)数组中二分求解.
class Solution:
    def jobScheduling(self, startTime: List[int], endTime: List[int], profit: List[int]) -> int:

        a, n = [], len(startTime)
        for i in range(n): a.append((endTime[i], startTime[i], profit[i]))
        a.sort(), endTime.sort()

        f = [0] * n
        f[0] = a[0][2]
        for i in range(1, n):
            index = bisect_right(endTime, a[i][1]) - 1
            x = f[index] if index >= 0 else 0
            f[i] = max(f[i - 1], x + a[i][2])
        
        return f[-1]              
class Solution:
    def jobScheduling(self, startTime: List[int], endTime: List[int], profit: List[int]) -> int:

        a, n = [], len(startTime)
        for i in range(n): a.append((endTime[i], startTime[i], profit[i]))
        a.sort(), endTime.sort()

        f = [0] * n
        for i in range(n):

            pos, l, r = i, 0, i
            while l <= r:
                mid = (l + r) // 2
                if endTime[mid] > a[i][1]: pos, r = mid, mid - 1
                else: l = mid + 1
            pos = pos - 1
            x = 0 if pos < 0 else f[pos]
            f[i] = max(f[i - 1], x + a[i][2])
        
        return f[-1]

posted on 2022-09-23 00:39  solvit  阅读(21)  评论(0)    收藏  举报

导航