@@ -106,7 +106,45 @@ tags:
106106
107107<!-- solution:start -->
108108
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$ 为会议的数量。
110148
111149<!-- tabs:start -->
112150
@@ -118,63 +156,223 @@ class Solution:
118156 self , eventTime : int , startTime : List[int ], endTime : List[int ]
119157 ) -> int :
120158 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
160178```
161179
162180#### Java
163181
164182``` 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+ }
166217```
167218
168219#### C++
169220
170221``` 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+ };
172256```
173257
174258#### Go
175259
176260``` 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+ ```
177338
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+ }
178376```
179377
180378<!-- tabs:end -->
0 commit comments