@@ -106,7 +106,45 @@ tags:
106
106
107
107
<!-- solution:start -->
108
108
109
- ### 方法一
109
+ ### 方法一:贪心
110
+
111
+ 根据题目描述,对于会议 $i$,我们记它左侧非空闲位置为 $l_i$,右侧非空闲位置为 $r_i$,记会议 $i$ 的时长为 $w_i = \text{endTime}[ i] - \text{startTime}[ i] $,则:
112
+
113
+ $$
114
+ l_i = \begin{cases}
115
+ 0 & i = 0 \\\\
116
+ \text{endTime}[i - 1] & i \gt 0
117
+ \end{cases}
118
+ $$
119
+
120
+ $$
121
+ r_i = \begin{cases}
122
+ \text{eventTime} & i = n - 1 \\\\
123
+ \text{startTime}[i + 1] & i \lt n - 1
124
+ \end{cases}
125
+ $$
126
+
127
+ 那么它可以向左移动,也可以向右移动,此时空闲时间为:
128
+
129
+ $$
130
+ r_i - l_i - w_i
131
+ $$
132
+
133
+ 如果左侧存在最大的空闲时间 $\text{pre}_ {i - 1}$,满足 $\text{pre}_ {i - 1} \geq w_i$,则可以将会议 $i$ 向左移动到该位置,得到新的空闲时间:
134
+
135
+ $$
136
+ r_i - l_i
137
+ $$
138
+
139
+ 同理,如果右侧存在最大的空闲时间 $\text{suf}_ {i + 1}$,满足 $\text{suf}_ {i + 1} \geq w_i$,则可以将会议 $i$ 向右移动到该位置,得到新的空闲时间:
140
+
141
+ $$
142
+ r_i - l_i
143
+ $$
144
+
145
+ 因此,我们首先预处理两个数组 $\text{pre}$ 和 $\text{suf}$,其中 $\text{pre}[ i] $ 表示 $[ 0, i] $ 范围内的最大空闲时间,$\text{suf}[ i] $ 表示 $[ i, n - 1] $ 范围内的最大空闲时间。然后遍历每个会议 $i$,计算它移动后的最大空闲时间,取最大值即可。
146
+
147
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为会议的数量。
110
148
111
149
<!-- tabs:start -->
112
150
@@ -118,63 +156,223 @@ class Solution:
118
156
self , eventTime : int , startTime : List[int ], endTime : List[int ]
119
157
) -> int :
120
158
n = len (startTime)
121
- res = 0
122
-
123
- left_gaps = [0 ] * n
124
- left_gaps[0 ] = startTime[0 ]
125
- for meet in range (1 , n):
126
- left_gaps[meet] = max (
127
- left_gaps[meet - 1 ], startTime[meet] - endTime[meet - 1 ]
128
- )
129
-
130
- right_gaps = [0 ] * n
131
- right_gaps[n - 1 ] = eventTime - endTime[- 1 ]
132
- for meet in range (n - 2 , - 1 , - 1 ):
133
- right_gaps[meet] = max (
134
- right_gaps[meet + 1 ], startTime[meet + 1 ] - endTime[meet]
135
- )
136
-
137
- for meet in range (n):
138
- left_gap = (
139
- left_gaps[meet] if meet == 0 else startTime[meet] - endTime[meet - 1 ]
140
- )
141
- right_gap = (
142
- right_gaps[meet]
143
- if meet == n - 1
144
- else startTime[meet + 1 ] - endTime[meet]
145
- )
146
-
147
- interval = 0
148
-
149
- if (
150
- meet != 0
151
- and left_gaps[meet - 1 ] >= (endTime[meet] - startTime[meet])
152
- or meet != n - 1
153
- and right_gaps[meet + 1 ] >= (endTime[meet] - startTime[meet])
154
- ):
155
- interval = endTime[meet] - startTime[meet]
156
-
157
- res = max (res, left_gap + interval + right_gap)
158
-
159
- return res
159
+ pre = [0 ] * n
160
+ suf = [0 ] * n
161
+ pre[0 ] = startTime[0 ]
162
+ suf[n - 1 ] = eventTime - endTime[- 1 ]
163
+ for i in range (1 , n):
164
+ pre[i] = max (pre[i - 1 ], startTime[i] - endTime[i - 1 ])
165
+ for i in range (n - 2 , - 1 , - 1 ):
166
+ suf[i] = max (suf[i + 1 ], startTime[i + 1 ] - endTime[i])
167
+ ans = 0
168
+ for i in range (n):
169
+ l = 0 if i == 0 else endTime[i - 1 ]
170
+ r = eventTime if i == n - 1 else startTime[i + 1 ]
171
+ w = endTime[i] - startTime[i]
172
+ ans = max (ans, r - l - w)
173
+ if i and pre[i - 1 ] >= w:
174
+ ans = max (ans, r - l)
175
+ elif i + 1 < n and suf[i + 1 ] >= w:
176
+ ans = max (ans, r - l)
177
+ return ans
160
178
```
161
179
162
180
#### Java
163
181
164
182
``` java
165
-
183
+ class Solution {
184
+ public int maxFreeTime (int eventTime , int [] startTime , int [] endTime ) {
185
+ int n = startTime. length;
186
+ int [] pre = new int [n];
187
+ int [] suf = new int [n];
188
+
189
+ pre[0 ] = startTime[0 ];
190
+ suf[n - 1 ] = eventTime - endTime[n - 1 ];
191
+
192
+ for (int i = 1 ; i < n; i++ ) {
193
+ pre[i] = Math . max(pre[i - 1 ], startTime[i] - endTime[i - 1 ]);
194
+ }
195
+
196
+ for (int i = n - 2 ; i >= 0 ; i-- ) {
197
+ suf[i] = Math . max(suf[i + 1 ], startTime[i + 1 ] - endTime[i]);
198
+ }
199
+
200
+ int ans = 0 ;
201
+ for (int i = 0 ; i < n; i++ ) {
202
+ int l = (i == 0 ) ? 0 : endTime[i - 1 ];
203
+ int r = (i == n - 1 ) ? eventTime : startTime[i + 1 ];
204
+ int w = endTime[i] - startTime[i];
205
+ ans = Math . max(ans, r - l - w);
206
+
207
+ if (i > 0 && pre[i - 1 ] >= w) {
208
+ ans = Math . max(ans, r - l);
209
+ } else if (i + 1 < n && suf[i + 1 ] >= w) {
210
+ ans = Math . max(ans, r - l);
211
+ }
212
+ }
213
+
214
+ return ans;
215
+ }
216
+ }
166
217
```
167
218
168
219
#### C++
169
220
170
221
``` cpp
171
-
222
+ class Solution {
223
+ public:
224
+ int maxFreeTime(int eventTime, vector<int >& startTime, vector<int >& endTime) {
225
+ int n = startTime.size();
226
+ vector<int > pre(n), suf(n);
227
+
228
+ pre[0] = startTime[0];
229
+ suf[n - 1] = eventTime - endTime[n - 1];
230
+
231
+ for (int i = 1; i < n; ++i) {
232
+ pre[i] = max(pre[i - 1], startTime[i] - endTime[i - 1]);
233
+ }
234
+
235
+ for (int i = n - 2 ; i >= 0 ; --i) {
236
+ suf[i] = max(suf[i + 1], startTime[i + 1] - endTime[i]);
237
+ }
238
+
239
+ int ans = 0;
240
+ for (int i = 0; i < n; ++i) {
241
+ int l = (i == 0) ? 0 : endTime[i - 1];
242
+ int r = (i == n - 1) ? eventTime : startTime[i + 1];
243
+ int w = endTime[i] - startTime[i];
244
+ ans = max(ans, r - l - w);
245
+
246
+ if (i > 0 && pre[i - 1] >= w) {
247
+ ans = max(ans, r - l);
248
+ } else if (i + 1 < n && suf[i + 1] >= w) {
249
+ ans = max(ans, r - l);
250
+ }
251
+ }
252
+
253
+ return ans;
254
+ }
255
+ };
172
256
```
173
257
174
258
#### Go
175
259
176
260
``` go
261
+ func maxFreeTime (eventTime int , startTime []int , endTime []int ) int {
262
+ n := len (startTime)
263
+ pre := make ([]int , n)
264
+ suf := make ([]int , n)
265
+
266
+ pre[0 ] = startTime[0 ]
267
+ suf[n-1 ] = eventTime - endTime[n-1 ]
268
+
269
+ for i := 1 ; i < n; i++ {
270
+ pre[i] = max (pre[i-1 ], startTime[i]-endTime[i-1 ])
271
+ }
272
+
273
+ for i := n - 2 ; i >= 0 ; i-- {
274
+ suf[i] = max (suf[i+1 ], startTime[i+1 ]-endTime[i])
275
+ }
276
+
277
+ ans := 0
278
+ for i := 0 ; i < n; i++ {
279
+ l := 0
280
+ if i > 0 {
281
+ l = endTime[i-1 ]
282
+ }
283
+ r := eventTime
284
+ if i < n-1 {
285
+ r = startTime[i+1 ]
286
+ }
287
+ w := endTime[i] - startTime[i]
288
+ ans = max (ans, r-l-w)
289
+
290
+ if i > 0 && pre[i-1 ] >= w {
291
+ ans = max (ans, r-l)
292
+ } else if i+1 < n && suf[i+1 ] >= w {
293
+ ans = max (ans, r-l)
294
+ }
295
+ }
296
+
297
+ return ans
298
+ }
299
+ ```
300
+
301
+ #### TypeScript
302
+
303
+ ``` ts
304
+ function maxFreeTime(eventTime : number , startTime : number [], endTime : number []): number {
305
+ const n = startTime .length ;
306
+ const pre: number [] = Array (n ).fill (0 );
307
+ const suf: number [] = Array (n ).fill (0 );
308
+
309
+ pre [0 ] = startTime [0 ];
310
+ suf [n - 1 ] = eventTime - endTime [n - 1 ];
311
+
312
+ for (let i = 1 ; i < n ; i ++ ) {
313
+ pre [i ] = Math .max (pre [i - 1 ], startTime [i ] - endTime [i - 1 ]);
314
+ }
315
+
316
+ for (let i = n - 2 ; i >= 0 ; i -- ) {
317
+ suf [i ] = Math .max (suf [i + 1 ], startTime [i + 1 ] - endTime [i ]);
318
+ }
319
+
320
+ let ans = 0 ;
321
+ for (let i = 0 ; i < n ; i ++ ) {
322
+ const l = i === 0 ? 0 : endTime [i - 1 ];
323
+ const r = i === n - 1 ? eventTime : startTime [i + 1 ];
324
+ const w = endTime [i ] - startTime [i ];
325
+
326
+ ans = Math .max (ans , r - l - w );
327
+
328
+ if (i > 0 && pre [i - 1 ] >= w ) {
329
+ ans = Math .max (ans , r - l );
330
+ } else if (i + 1 < n && suf [i + 1 ] >= w ) {
331
+ ans = Math .max (ans , r - l );
332
+ }
333
+ }
334
+
335
+ return ans ;
336
+ }
337
+ ```
177
338
339
+ #### Rust
340
+
341
+ ``` rust
342
+ impl Solution {
343
+ pub fn max_free_time (event_time : i32 , start_time : Vec <i32 >, end_time : Vec <i32 >) -> i32 {
344
+ let n = start_time . len ();
345
+ let mut pre = vec! [0 ; n ];
346
+ let mut suf = vec! [0 ; n ];
347
+
348
+ pre [0 ] = start_time [0 ];
349
+ suf [n - 1 ] = event_time - end_time [n - 1 ];
350
+
351
+ for i in 1 .. n {
352
+ pre [i ] = pre [i - 1 ]. max (start_time [i ] - end_time [i - 1 ]);
353
+ }
354
+
355
+ for i in (0 .. n - 1 ). rev () {
356
+ suf [i ] = suf [i + 1 ]. max (start_time [i + 1 ] - end_time [i ]);
357
+ }
358
+
359
+ let mut ans = 0 ;
360
+ for i in 0 .. n {
361
+ let l = if i == 0 { 0 } else { end_time [i - 1 ] };
362
+ let r = if i == n - 1 { event_time } else { start_time [i + 1 ] };
363
+ let w = end_time [i ] - start_time [i ];
364
+ ans = ans . max (r - l - w );
365
+
366
+ if i > 0 && pre [i - 1 ] >= w {
367
+ ans = ans . max (r - l );
368
+ } else if i + 1 < n && suf [i + 1 ] >= w {
369
+ ans = ans . max (r - l );
370
+ }
371
+ }
372
+
373
+ ans
374
+ }
375
+ }
178
376
```
179
377
180
378
<!-- tabs:end -->
0 commit comments