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
.
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.
Input: events = [[1,3,2],[4,5,2],[1,5,5]] Output: 5 Explanation: Choose event 2 for a sum of 5.
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.
2 <= events.length <= 105
events[i].length == 3
1 <= startTimei <= endTimei <= 109
1 <= valuei <= 106
impl Solution {
pub fn max_two_events(events: Vec<Vec<i32>>) -> i32 {
let mut events0 = events.iter().map(|e| (e[0], e[2])).collect::<Vec<_>>();
let mut events1 = events.iter().map(|e| (e[1], e[2])).collect::<Vec<_>>();
let mut max_end_value = 0;
let mut i = 0;
let mut ret = 0;
events0.sort_unstable();
events1.sort_unstable();
for j in 0..events0.len() {
while i < events1.len() && events1[i].0 < events0[j].0 {
max_end_value = max_end_value.max(events1[i].1);
i += 1;
}
ret = ret.max(events0[j].1 + max_end_value);
}
ret
}
}