leetcode - 1751. Maximum Number of Events That Can Be Attended II

Description

You are given an array of events where events[i] = [startDayi, endDayi, valuei]. The ith event starts at startDayi and ends at endDayi, and if you attend this event, you will receive a value of valuei. You are also given an integer k which represents the maximum number of events you can attend.

You can only attend one event at a time. If you choose to attend an event, you must attend the entire event. Note that the end day is inclusive: that is, you cannot attend two events where one of them starts and the other ends on the same day.

Return the maximum sum of values that you can receive by attending events.

Example 1:

leetcode - 1751. Maximum Number of Events That Can Be Attended II_第1张图片

Input: events = [[1,2,4],[3,4,3],[2,3,1]], k = 2
Output: 7
Explanation: Choose the green events, 0 and 1 (0-indexed) for a total value of 4 + 3 = 7.

Example 2:

leetcode - 1751. Maximum Number of Events That Can Be Attended II_第2张图片

Input: events = [[1,2,4],[3,4,3],[2,3,10]], k = 2
Output: 10
Explanation: Choose event 2 for a total value of 10.
Notice that you cannot attend any other event as they overlap, and that you do not have to attend k events.

Example 3:

leetcode - 1751. Maximum Number of Events That Can Be Attended II_第3张图片

Input: events = [[1,1,1],[2,2,2],[3,3,3],[4,4,4]], k = 3
Output: 9
Explanation: Although the events do not overlap, you can only attend 3 events. Pick the highest valued three.

Constraints:

1 <= k <= events.length
1 <= k * events.length <= 10^6
1 <= startDayi <= endDayi <= 10^9
1 <= valuei <= 10^6

Solution

Solved after learning from other solutions…

Recursive, for each interval, either choose it or not.

Time complexity: o ( n 2 ) o(n^2) o(n2)
Space complxity: o ( n ) o(n) o(n)

Code

class Solution:
    def __init__(self,) -> None:
        self.memo = {}

    def maxValue(self, events: List[List[int]], k: int) -> int:
        
        def helper(event_index: int, k: int) -> int:
            """
            event_index:
            k:
            """
            if event_index >= len(events) or k == 0:
                return 0
            if (event_index, k) in self.memo:
                return self.memo[(event_index, k)]
            i = event_index + 1
            while i < len(events):
                if events[i][0] > events[event_index][1]:
                    break
                i += 1                
            self.memo[(event_index, k)] = max(helper(i, k - 1) + events[event_index][2], helper(event_index + 1, k))
            return self.memo[(event_index, k)]
        
        events.sort()
        return helper(0, k)

你可能感兴趣的:(OJ题目记录,leetcode,算法,职场和发展)