website/content/ChapterFour/1300~1399/1353.Maximum-Number-of-Events-That-Can-Be-Attended.md
Given an array of events where events[i] = [startDayi, endDayi]. Every event i starts at startDayi and ends at endDayi.
You can attend an event i at any day d where startTimei <= d <= endTimei. Notice that you can only attend one event at any time d.
Return the maximum number of events you can attend.
Example 1:
Input: events = [[1,2],[2,3],[3,4]]
Output: 3
Explanation: You can attend all the three events.
One way to attend them all is as shown.
Attend the first event on day 1.
Attend the second event on day 2.
Attend the third event on day 3.
Example 2:
Input: events= [[1,2],[2,3],[3,4],[1,2]]
Output: 4
Example 3:
Input: events = [[1,4],[4,4],[2,2],[3,4],[1,1]]
Output: 4
Example 4:
Input: events = [[1,100000]]
Output: 1
Example 5:
Input: events = [[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7]]
Output: 7
Constraints:
1 <= events.length <= 10^5events[i].length == 21 <= startDayi <= endDayi <= 10^5给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。请你返回你可以参加的 最大 会议数目。
package leetcode
import (
"sort"
)
func maxEvents(events [][]int) int {
sort.Slice(events, func(i, j int) bool {
if events[i][0] == events[j][0] {
return events[i][1] < events[j][1]
}
return events[i][0] < events[j][0]
})
attended, current := 1, events[0]
for i := 1; i < len(events); i++ {
prev, event := events[i-1], events[i]
if event[0] == prev[0] && event[1] == prev[1] && event[1] == event[0] {
continue
}
start, end := max(current[0], event[0]-1), max(current[1], event[1])
if end-start > 0 {
current[0] = start + 1
current[1] = end
attended++
}
}
return attended
}
func max(a, b int) int {
if a > b {
return a
}
return b
}