@@ -93,32 +93,343 @@ tags:
9393
9494<!--  solution:start --> 
9595
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$ 是会议的数量。
97109
98110<!--  tabs:start --> 
99111
100112#### Python3  
101113
102114``` 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
104130``` 
105131
106132#### Java  
107133
108134``` 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+ }
110155``` 
111156
112157#### C++  
113158
114159``` 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 =  endTime .length ;
213+     const :  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+ ``` 
115295
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+ };
116351``` 
117352
118353#### Go 
119354
120355```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 =  endTime .length ;
384+     const =  (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+ ``` 
121405
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+ }
122433``` 
123434
124435<!-- tabs: end  -->
0 commit comments