@@ -93,32 +93,343 @@ tags:
93
93
94
94
<!-- solution:start -->
95
95
96
- ### 方法一
96
+ ### 方法一:滑动窗口
97
+
98
+ 题目相当于把相邻的空闲时间段合并成一个更长的空闲时间段。一共有 $n + 1$ 个空闲时间段,分别是:
99
+
100
+ - 第一个空闲时间段是从活动开始到第一个会议开始的时间段;
101
+ - 中间的 $n - 1$ 个空闲时间段是相邻两个会议之间的时间段;
102
+ - 最后一个空闲时间段是最后一个会议结束到活动结束的时间段。
103
+
104
+ 题目最多可以重新安排 $k$ 个会议,等价于最多可以合并 $k + 1$ 个空闲时间段。我们需要找到这 $k + 1$ 个空闲时间段的最大长度。
105
+
106
+ 我们可以将这些空闲时间段的长度存储在一个数组中 $\textit{nums}$ 中。然后,我们一个长度为 $k + 1$ 的滑动窗口,遍历这个数组,计算每个窗口的和,找到最大的和,即为所求的最大空闲时间。
107
+
108
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是会议的数量。
97
109
98
110
<!-- tabs:start -->
99
111
100
112
#### Python3
101
113
102
114
``` python
103
-
115
+ class Solution :
116
+ def maxFreeTime (
117
+ self , eventTime : int , k : int , startTime : List[int ], endTime : List[int ]
118
+ ) -> int :
119
+ nums = [startTime[0 ]]
120
+ for i in range (1 , len (endTime)):
121
+ nums.append(startTime[i] - endTime[i - 1 ])
122
+ nums.append(eventTime - endTime[- 1 ])
123
+ ans = s = 0
124
+ for i, x in enumerate (nums):
125
+ s += x
126
+ if i >= k:
127
+ ans = max (ans, s)
128
+ s -= nums[i - k]
129
+ return ans
104
130
```
105
131
106
132
#### Java
107
133
108
134
``` java
109
-
135
+ class Solution {
136
+ public int maxFreeTime (int eventTime , int k , int [] startTime , int [] endTime ) {
137
+ int n = endTime. length;
138
+ int [] nums = new int [n + 1 ];
139
+ nums[0 ] = startTime[0 ];
140
+ for (int i = 1 ; i < n; ++ i) {
141
+ nums[i] = startTime[i] - endTime[i - 1 ];
142
+ }
143
+ nums[n] = eventTime - endTime[n - 1 ];
144
+ int ans = 0 , s = 0 ;
145
+ for (int i = 0 ; i <= n; ++ i) {
146
+ s += nums[i];
147
+ if (i >= k) {
148
+ ans = Math . max(ans, s);
149
+ s -= nums[i - k];
150
+ }
151
+ }
152
+ return ans;
153
+ }
154
+ }
110
155
```
111
156
112
157
#### C++
113
158
114
159
``` cpp
160
+ class Solution {
161
+ public:
162
+ int maxFreeTime(int eventTime, int k, vector<int >& startTime, vector<int >& endTime) {
163
+ int n = endTime.size();
164
+ vector<int > nums(n + 1);
165
+ nums[ 0] = startTime[ 0] ;
166
+ for (int i = 1; i < n; ++i) {
167
+ nums[ i] = startTime[ i] - endTime[ i - 1] ;
168
+ }
169
+ nums[ n] = eventTime - endTime[ n - 1] ;
170
+
171
+ int ans = 0, s = 0;
172
+ for (int i = 0; i <= n; ++i) {
173
+ s += nums[i];
174
+ if (i >= k) {
175
+ ans = max(ans, s);
176
+ s -= nums[i - k];
177
+ }
178
+ }
179
+ return ans;
180
+ }
181
+ };
182
+ ```
183
+
184
+ #### Go
185
+
186
+ ``` go
187
+ func maxFreeTime (eventTime int , k int , startTime []int , endTime []int ) int {
188
+ n := len (endTime)
189
+ nums := make ([]int , n+1 )
190
+ nums[0 ] = startTime[0 ]
191
+ for i := 1 ; i < n; i++ {
192
+ nums[i] = startTime[i] - endTime[i-1 ]
193
+ }
194
+ nums[n] = eventTime - endTime[n-1 ]
195
+
196
+ ans , s := 0 , 0
197
+ for i := 0 ; i <= n; i++ {
198
+ s += nums[i]
199
+ if i >= k {
200
+ ans = max (ans, s)
201
+ s -= nums[i-k]
202
+ }
203
+ }
204
+ return ans
205
+ }
206
+ ```
207
+
208
+ #### TypeScript
209
+
210
+ ``` ts
211
+ function maxFreeTime(eventTime : number , k : number , startTime : number [], endTime : number []): number {
212
+ const n = endTime .length ;
213
+ const nums: number [] = new Array (n + 1 );
214
+ nums [0 ] = startTime [0 ];
215
+ for (let i = 1 ; i < n ; i ++ ) {
216
+ nums [i ] = startTime [i ] - endTime [i - 1 ];
217
+ }
218
+ nums [n ] = eventTime - endTime [n - 1 ];
219
+
220
+ let [ans, s] = [0 , 0 ];
221
+ for (let i = 0 ; i <= n ; i ++ ) {
222
+ s += nums [i ];
223
+ if (i >= k ) {
224
+ ans = Math .max (ans , s );
225
+ s -= nums [i - k ];
226
+ }
227
+ }
228
+ return ans ;
229
+ }
230
+ ```
231
+
232
+ #### Rust
233
+
234
+ ``` rust
235
+ impl Solution {
236
+ pub fn max_free_time (event_time : i32 , k : i32 , start_time : Vec <i32 >, end_time : Vec <i32 >) -> i32 {
237
+ let n = end_time . len ();
238
+ let mut nums = vec! [0 ; n + 1 ];
239
+ nums [0 ] = start_time [0 ];
240
+ for i in 1 .. n {
241
+ nums [i ] = start_time [i ] - end_time [i - 1 ];
242
+ }
243
+ nums [n ] = event_time - end_time [n - 1 ];
244
+
245
+ let mut ans = 0 ;
246
+ let mut s = 0 ;
247
+ for i in 0 ..= n {
248
+ s += nums [i ];
249
+ if i as i32 >= k {
250
+ ans = ans . max (s );
251
+ s -= nums [i - k as usize ];
252
+ }
253
+ }
254
+ ans
255
+ }
256
+ }
257
+ ```
258
+
259
+ <!-- tabs:end -->
260
+
261
+ <!-- solution:end -->
262
+
263
+ <!-- solution:start -->
264
+
265
+ ### 方法二:滑动窗口(空间优化)
266
+
267
+ 在方法一中,我们使用了一个数组来存储空闲时间段的长度。实际上,我们不需要存储整个数组,可以用一个函数 $f(i)$ 来表示第 $i$ 个空闲时间段的长度。这样可以节省空间。
268
+
269
+ 时间复杂度 $O(n)$,其中 $n$ 是会议的数量。空间复杂度 $O(1)$。
270
+
271
+ <!-- tabs:start -->
272
+
273
+ #### Python3
274
+
275
+ ``` python
276
+ class Solution :
277
+ def maxFreeTime (
278
+ self , eventTime : int , k : int , startTime : List[int ], endTime : List[int ]
279
+ ) -> int :
280
+ def f (i : int ) -> int :
281
+ if i == 0 :
282
+ return startTime[0 ]
283
+ if i == len (endTime):
284
+ return eventTime - endTime[- 1 ]
285
+ return startTime[i] - endTime[i - 1 ]
286
+
287
+ ans = s = 0
288
+ for i in range (len (endTime) + 1 ):
289
+ s += f(i)
290
+ if i >= k:
291
+ ans = max (ans, s)
292
+ s -= f(i - k)
293
+ return ans
294
+ ```
115
295
296
+ #### Java
297
+
298
+ ``` java
299
+ class Solution {
300
+ public int maxFreeTime (int eventTime , int k , int [] startTime , int [] endTime ) {
301
+ int n = endTime. length;
302
+ IntUnaryOperator f = i - > {
303
+ if (i == 0 ) {
304
+ return startTime[0 ];
305
+ }
306
+ if (i == n) {
307
+ return eventTime - endTime[n - 1 ];
308
+ }
309
+ return startTime[i] - endTime[i - 1 ];
310
+ };
311
+ int ans = 0 , s = 0 ;
312
+ for (int i = 0 ; i <= n; i++ ) {
313
+ s += f. applyAsInt(i);
314
+ if (i >= k) {
315
+ ans = Math . max(ans, s);
316
+ s -= f. applyAsInt(i - k);
317
+ }
318
+ }
319
+ return ans;
320
+ }
321
+ }
322
+ ```
323
+
324
+ #### C++
325
+
326
+ ``` cpp
327
+ class Solution {
328
+ public:
329
+ int maxFreeTime(int eventTime, int k, vector<int >& startTime, vector<int >& endTime) {
330
+ int n = endTime.size();
331
+ auto f = [ &] (int i) -> int {
332
+ if (i == 0) {
333
+ return startTime[ 0] ;
334
+ }
335
+ if (i == n) {
336
+ return eventTime - endTime[ n - 1] ;
337
+ }
338
+ return startTime[ i] - endTime[ i - 1] ;
339
+ };
340
+ int ans = 0, s = 0;
341
+ for (int i = 0; i <= n; ++i) {
342
+ s += f(i);
343
+ if (i >= k) {
344
+ ans = max(ans, s);
345
+ s -= f(i - k);
346
+ }
347
+ }
348
+ return ans;
349
+ }
350
+ };
116
351
```
117
352
118
353
#### Go
119
354
120
355
```go
356
+ func maxFreeTime(eventTime int, k int, startTime []int, endTime []int) int {
357
+ n := len(endTime)
358
+ f := func(i int) int {
359
+ if i == 0 {
360
+ return startTime[0]
361
+ }
362
+ if i == n {
363
+ return eventTime - endTime[n-1]
364
+ }
365
+ return startTime[i] - endTime[i-1]
366
+ }
367
+ ans, s := 0, 0
368
+ for i := 0; i <= n; i++ {
369
+ s += f(i)
370
+ if i >= k {
371
+ ans = max(ans, s)
372
+ s -= f(i - k)
373
+ }
374
+ }
375
+ return ans
376
+ }
377
+ ```
378
+
379
+ #### TypeScript
380
+
381
+ ``` ts
382
+ function maxFreeTime(eventTime : number , k : number , startTime : number [], endTime : number []): number {
383
+ const n = endTime .length ;
384
+ const f = (i : number ): number => {
385
+ if (i === 0 ) {
386
+ return startTime [0 ];
387
+ }
388
+ if (i === n ) {
389
+ return eventTime - endTime [n - 1 ];
390
+ }
391
+ return startTime [i ] - endTime [i - 1 ];
392
+ };
393
+ let ans = 0 ;
394
+ let s = 0 ;
395
+ for (let i = 0 ; i <= n ; i ++ ) {
396
+ s += f (i );
397
+ if (i >= k ) {
398
+ ans = Math .max (ans , s );
399
+ s -= f (i - k );
400
+ }
401
+ }
402
+ return ans ;
403
+ }
404
+ ```
121
405
406
+ #### Rust
407
+
408
+ ``` rust
409
+ impl Solution {
410
+ pub fn max_free_time (event_time : i32 , k : i32 , start_time : Vec <i32 >, end_time : Vec <i32 >) -> i32 {
411
+ let n = end_time . len ();
412
+ let f = | i : usize | -> i32 {
413
+ if i == 0 {
414
+ start_time [0 ]
415
+ } else if i == n {
416
+ event_time - end_time [n - 1 ]
417
+ } else {
418
+ start_time [i ] - end_time [i - 1 ]
419
+ }
420
+ };
421
+ let mut ans = 0 ;
422
+ let mut s = 0 ;
423
+ for i in 0 ..= n {
424
+ s += f (i );
425
+ if i >= k as usize {
426
+ ans = ans . max (s );
427
+ s -= f (i - k as usize );
428
+ }
429
+ }
430
+ ans
431
+ }
432
+ }
122
433
```
123
434
124
435
<!-- tabs: end -->
0 commit comments