# 2054. Two Best Non-Overlapping Events ###### tags: `Leetcode` `Medium` `Line Sweep` `Greedy` `Sorting` Link: https://leetcode.com/problems/two-best-non-overlapping-events/description/ ## 思路 ### Line Sweep ### Greedy Sorting map里面存的是在key及key之前结束的event的最大value 所以我们要先将所有event按照结束时间排序 然后对于每一个新的event 我们看看map里面有没有在它之前 并且不跟他重叠的event 更新答案 然后要看要不要用这个新的event更新map 也就是我们要看有没有key比当前event的end time早或者相等 如果有的话 看它的value是多少 如果value比当前value大 说明我们不需要更新 否则就需要更新 ## Code ### Line Sweep ```python= class Solution: def maxTwoEvents(self, events: List[List[int]]) -> int: line = [] ans = 0 for s, e, v in events: line.append((s, True, v)) line.append((e+1, False, v)) line.sort() currMax = 0 for time, is_start, val in line: if is_start: ans = max(ans, currMax+val) else: currMax = max(currMax, val) return ans ``` ### Greedy Sorting ```java= class Solution { public int maxTwoEvents(int[][] events) { Arrays.sort(events, (a,b)->(a[1]-b[1])); TreeMap<Integer, Integer> map = new TreeMap<>(); int ans = 0; for(int[] event: events){ int start = event[0], end = event[1], val = event[2]; Integer smallerThanStart = map.lowerKey(start); if(smallerThanStart==null) ans = Math.max(ans, val); else ans = Math.max(ans, map.get(smallerThanStart)+val); Integer smOrEqThanEnd = map.floorKey(end); if(smOrEqThanEnd==null) map.put(end, val); else map.put(end, Math.max(map.get(smOrEqThanEnd), val)); } return ans; } } ```