-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path3440-RescheduleMeetingsForMaximumFreeTimeII.go
More file actions
225 lines (206 loc) · 8.18 KB
/
3440-RescheduleMeetingsForMaximumFreeTimeII.go
File metadata and controls
225 lines (206 loc) · 8.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
package main
// 3440. Reschedule Meetings for Maximum Free Time II
// You are given an integer eventTime denoting the duration of an event.
// You are also given two integer arrays startTime and endTime, each of length n.
// These represent the start and end times of n non-overlapping meetings that occur during the event between time t = 0 and time t = eventTime,
// where the ith meeting occurs during the time [startTime[i], endTime[i]].
// You can reschedule at most one meeting by moving its start time while maintaining the same duration,
// such that the meetings remain non-overlapping,
// to maximize the longest continuous period of free time during the event.
// Return the maximum amount of free time possible after rearranging the meetings.
// Note that the meetings can not be rescheduled to a time outside the event and they should remain non-overlapping.
// Note: In this version, it is valid for the relative ordering of the meetings to change after rescheduling one meeting.
// Example 1:
// Input: eventTime = 5, startTime = [1,3], endTime = [2,5]
// Output: 2
// Explanation:
// <img src="https://assets.leetcode.com/uploads/2024/12/22/example0_rescheduled.png" />
// Reschedule the meeting at [1, 2] to [2, 3], leaving no meetings during the time [0, 2].
// Example 2:
// Input: eventTime = 10, startTime = [0,7,9], endTime = [1,8,10]
// Output: 7
// Explanation:
// <img src="https://assets.leetcode.com/uploads/2024/12/22/rescheduled_example0.png" />
// Reschedule the meeting at [0, 1] to [8, 9], leaving no meetings during the time [0, 7].
// Example 3:
// Input: eventTime = 10, startTime = [0,3,7,9], endTime = [1,4,8,10]
// Output: 6
// Explanation:
// <img src="https://assets.leetcode.com/uploads/2025/01/28/image3.png" />
// Reschedule the meeting at [3, 4] to [8, 9], leaving no meetings during the time [1, 7].
// Example 4:
// Input: eventTime = 5, startTime = [0,1,2,3,4], endTime = [1,2,3,4,5]
// Output: 0
// Explanation:
// There is no time during the event not occupied by meetings.
// Constraints:
// 1 <= eventTime <= 10^9
// n == startTime.length == endTime.length
// 2 <= n <= 10^5
// 0 <= startTime[i] < endTime[i] <= eventTime
// endTime[i] <= startTime[i + 1] where i lies in the range [0, n - 2].
import "fmt"
// 至多调整一个会议
// 移动之后相对位置可以变动
func maxFreeTime(eventTime int, startTime []int, endTime []int) int {
n := len(startTime)
// 获取 i 左边的间隔
get := func(i int) int {
if i == 0 {
return startTime[0]
} else if i == n {
return eventTime - endTime[i-1]
}
return startTime[i] - endTime[i-1]
}
// 最大的三个间隔的下标,求的是左边的间隔
a, b, c := 0, -1, -1
for i := 1; i <= n; i++ {
sz := get(i)
if sz > get(a) {
a, b, c = i, a, b
} else if b < 0 || sz > get(b) {
b, c = i, b
} else if c < 0 || sz > get(c) {
c = i
}
}
res := 0
max := func (x, y int) int { if x > y { return x; }; return y; }
for i := 0; i < n; i++ {
diff := endTime[i] - startTime[i]
if (i != a && i+1 != a && get(a) >= diff) || (i != b && i+1 != b && get(b) >= diff) || (i != c && i+1 != c && get(c) >= diff) {
res = max(res, get(i) + get(i + 1) + diff)
} else {
res = max(res, get(i) + get(i + 1))
}
}
return res
}
func maxFreeTime1(eventTime int, startTime []int, endTime []int) int {
res, mx, left, right, curr, n := 0, 0, 0, 0, 0, len(startTime)
max := func (x, y int) int { if x > y { return x; }; return y; }
for i := 0; i < n; i++ {
if i == 0 {
left = startTime[i]
} else {
left = startTime[i] - endTime[i-1]
}
if i == n-1 {
right = eventTime - endTime[n-1]
} else {
right = startTime[i+1] - endTime[i]
}
curr = endTime[i] - startTime[i]
if mx >= curr {
res = max(res, left + right + curr)
} else {
res = max(res, left + right)
}
mx = max(mx, left)
}
mx = 0
for i := n - 1; i >= 0; i-- {
if i == 0 {
left = startTime[i]
} else {
left = startTime[i] - endTime[i-1]
}
if i == n - 1 {
right = eventTime - endTime[n - 1]
} else {
right = startTime[i + 1] - endTime[i]
}
curr = endTime[i] - startTime[i]
if mx >= curr {
res = max(res, left + right + curr)
} else {
res = max(res, left + right)
}
mx = max(mx, right)
}
return res
}
func maxFreeTime2(eventTime int, startTime []int, endTime []int) int {
n, t1, t2 := len(startTime), 0, 0
q := make([]bool, n)
max := func (x, y int) int { if x > y { return x; }; return y; }
for i := 0; i < n; i++ {
if endTime[i] - startTime[i] <= t1 {
q[i] = true
}
if i == 0 {
t1 = max(t1, startTime[i])
} else {
t1 = max(t1, startTime[i] - endTime[i - 1])
}
if endTime[n - i - 1] - startTime[n - i - 1] <= t2 {
q[n - i - 1] = true
}
if i == 0 {
t2 = max(t2, eventTime - endTime[n - 1])
} else {
t2 = max(t2, startTime[n - i] - endTime[n - i - 1])
}
}
res := 0
for i := 0; i < n; i++ {
left := 0
if i != 0 {
left = endTime[i - 1]
}
right := eventTime
if i != n - 1 {
right = startTime[i + 1]
}
if q[i] {
res = max(res, right - left)
} else {
res = max(res, right - left - (endTime[i] - startTime[i]))
}
}
return res
}
func main() {
// Example 1:
// Input: eventTime = 5, startTime = [1,3], endTime = [2,5]
// Output: 2
// Explanation:
// <img src="https://assets.leetcode.com/uploads/2024/12/22/example0_rescheduled.png" />
// Reschedule the meeting at [1, 2] to [2, 3], leaving no meetings during the time [0, 2].
fmt.Println(maxFreeTime(5, []int{1,3}, []int{2,5})) // 2
// Example 2:
// Input: eventTime = 10, startTime = [0,7,9], endTime = [1,8,10]
// Output: 7
// Explanation:
// <img src="https://assets.leetcode.com/uploads/2024/12/22/rescheduled_example0.png" />
// Reschedule the meeting at [0, 1] to [8, 9], leaving no meetings during the time [0, 7].
fmt.Println(maxFreeTime(10, []int{0,7,9}, []int{1,8,10})) // 7
// Example 3:
// Input: eventTime = 10, startTime = [0,3,7,9], endTime = [1,4,8,10]
// Output: 6
// Explanation:
// <img src="https://assets.leetcode.com/uploads/2025/01/28/image3.png" />
// Reschedule the meeting at [3, 4] to [8, 9], leaving no meetings during the time [1, 7].
fmt.Println(maxFreeTime(10, []int{0,3,7,9}, []int{1,4,8,10})) // 6
// Example 4:
// Input: eventTime = 5, startTime = [0,1,2,3,4], endTime = [1,2,3,4,5]
// Output: 0
// Explanation:
// There is no time during the event not occupied by meetings.
fmt.Println(maxFreeTime(5, []int{0,1,2,3,4}, []int{1,2,3,4,5})) // 0
fmt.Println(maxFreeTime(5, []int{1,2,3,4,5,6,7,8,9}, []int{9,8,7,6,5,4,3,2,1})) // 6
fmt.Println(maxFreeTime(5, []int{9,8,7,6,5,4,3,2,1}, []int{1,2,3,4,5,6,7,8,9})) // 8
fmt.Println(maxFreeTime1(5, []int{1,3}, []int{2,5})) // 2
fmt.Println(maxFreeTime1(10, []int{0,7,9}, []int{1,8,10})) // 7
fmt.Println(maxFreeTime1(10, []int{0,3,7,9}, []int{1,4,8,10})) // 6
fmt.Println(maxFreeTime1(5, []int{0,1,2,3,4}, []int{1,2,3,4,5})) // 0
fmt.Println(maxFreeTime1(5, []int{1,2,3,4,5,6,7,8,9}, []int{9,8,7,6,5,4,3,2,1})) // 6
fmt.Println(maxFreeTime1(5, []int{9,8,7,6,5,4,3,2,1}, []int{1,2,3,4,5,6,7,8,9})) // 8
fmt.Println(maxFreeTime2(5, []int{1,3}, []int{2,5})) // 2
fmt.Println(maxFreeTime2(10, []int{0,7,9}, []int{1,8,10})) // 7
fmt.Println(maxFreeTime2(10, []int{0,3,7,9}, []int{1,4,8,10})) // 6
fmt.Println(maxFreeTime2(5, []int{0,1,2,3,4}, []int{1,2,3,4,5})) // 0
fmt.Println(maxFreeTime2(5, []int{1,2,3,4,5,6,7,8,9}, []int{9,8,7,6,5,4,3,2,1})) // 6
fmt.Println(maxFreeTime2(5, []int{9,8,7,6,5,4,3,2,1}, []int{1,2,3,4,5,6,7,8,9})) // 8
}