leetcode - 2054. Two Best Non-Overlapping Events

Description

You are given a 0-indexed 2D integer array of events where events[i] = [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
相关推荐
DeniuHe22 分钟前
逻辑回归(Logistic Regression)详细解释与公式推导
算法·机器学习·逻辑回归
迅量科技资讯分享26 分钟前
手机拍照明晰度评估:传感器尺寸像素数量与处理器算法解析
算法·三星·像素
liu****28 分钟前
12.线程同步与互斥
linux·数据结构·c++·算法·1024程序员节
麦烤楽鸡翅42 分钟前
小红书推荐系统(牛客)
java·python·算法·秋招·春招·牛客·面试算法题
王哈哈^_^1 小时前
CV三大核心任务:目标检测、图像分割、关键点检测
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测
wefg11 小时前
【数据结构】红黑树
数据结构·算法
饼瑶1 小时前
基于AutoDL远端服务复现具身智能论文OpenVLA
算法
Mr.Winter`1 小时前
无人船 | 图解基于MPC控制的路径跟踪算法(以全驱动无人艇WAMV为例)
人工智能·算法·机器人·自动驾驶·ros·路径规划
咪咪渝粮2 小时前
112.路径总和
java·数据结构·算法
高洁012 小时前
大模型-详解 Vision Transformer (ViT) (2
深度学习·算法·aigc·transformer·知识图谱