leetcode - 2054. Two Best Non-Overlapping Events

Description

You are given a 0-indexed 2D integer array of events where eventsi = startTimei, endTimei, valuei. The ith event starts at startTimei and ends at endTimei, and if you attend this event, you will receive a value of valuei. You can choose at most two non-overlapping events to attend such that the sum of their values is maximized.

Return this maximum sum.

Note that the start time and end time is inclusive: that is, you cannot attend two events where one of them starts and the other ends at the same time. More specifically, if you attend an event with end time t, the next event must start at or after t + 1.

Example 1:

复制代码
Input: events = [[1,3,2],[4,5,2],[2,4,3]]
Output: 4
Explanation: Choose the green events, 0 and 1 for a sum of 2 + 2 = 4.

Example 2:

复制代码
Input: events = [[1,3,2],[4,5,2],[1,5,5]]
Output: 5
Explanation: Choose event 2 for a sum of 5.

Example 3:

复制代码
Input: events = [[1,5,3],[1,5,1],[6,6,5]]
Output: 8
Explanation: Choose events 0 and 2 for a sum of 3 + 5 = 8.

Constraints:

复制代码
2 <= events.length <= 10^5
events[i].length == 3
1 <= startTimei <= endTimei <= 10^9
1 <= valuei <= 10^6

Solution

Solved after help...

Heap

Use a min-heap to store events with earlier ending time. When we have a new event, pop from the heap to get non-overlapping events, and stop until the earliest event in heap is over-lapping. Use a variable to store the maximum value during popping, and when we stop, we have a possible maximum pair: with the current one and the maximum one.

We need to sort the events by start time first.

Time complexity: o ( n log ⁡ n ) o(n\log n) o(nlogn)

Space complexity: o ( n ) o(n) o(n)

Greedy

How could someone come up with this solution??? @_@

This is actually similar to heap. So in heap, a key thing we need to do is: use max_val to keep track of all the values of events that end earlier than the current one. So if we flatten the events by its time, and each time when we see a start of an event, we know we could pair it with the most valuable event that ends earlier than it. Each time we see a close of an event, we know we could update the "most valuable event that ends earlier".

To do so, use end_time + 1 as the time for endings, and put it before the start if we have a tie.

Time complexity: o ( n log ⁡ n ) o(n\log n) o(nlogn)

Space complexity: o ( n ) o(n) o(n)

Code

Heap

python3 复制代码
class Solution:
    def maxTwoEvents(self, events: List[List[int]]) -> int:
        # (end_time, val)
        prev_events = []
        events.sort(key=lambda x: x[0])
        res = 0
        max_val = 0
        for start_time, end_time, val in events:
            while prev_events and prev_events[0][0] < start_time:
                _, top_val = heapq.heappop(prev_events)
                max_val = max(max_val, top_val)
            res = max(res, max_val + val)
            heapq.heappush(prev_events, (end_time, val))
        return res

Greedy

python3 复制代码
class Solution:
    def maxTwoEvents(self, events: List[List[int]]) -> int:
        event_items = []
        for start_time, end_time, val in events:
            event_items.append((start_time, 1, val))
            event_items.append((end_time + 1, 0, val))
        event_items.sort()
        res = 0
        max_val = 0
        for event_time, event_type, val in event_items:
            if event_type == 1:
                res = max(res, val + max_val)
            else:
                max_val = max(max_val, val)
        return res
相关推荐
zyl76514 小时前
FlashAttention 详解:从 GPU 硬件、普通 Attention 到分块计算与 Online Softmax
算法
爱读书的小胖18 小时前
LeetCode 122:买卖股票的最佳时机 II(C)解题分析
算法
结局无敌18 小时前
React Native for OpenHarmony 实战:三方库 react-native-modal-dialog 的鸿蒙化适配指南
深度学习·算法·react native·react.js·harmonyos
ychqsq18 小时前
234.无题
经验分享·职场和发展
OPEN-F18 小时前
ROS2系列教程:上位机建图与导航(原理综合)
算法·机器人
weixin_3077791318 小时前
C++代码实现MATLAB中的fitrtree函数功能
开发语言·c++·算法·matlab
tomwang032219 小时前
路径优化建模、优化算法分类及工程化小结
算法·数学建模·分类
小羊没烦恼!19 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
考研保研资料分享19 小时前
物理保研至中科大:固体物理复习、四场面试与科研追问
面试·职场和发展
2501_9269783319 小时前
人机通信协议--人和机器之间的交互想象
人工智能·经验分享·算法·ai写作