Skip to content

Commit 8b4d7ac

Browse files
committed
feat: add solutions to lc problem: No.3440
No.3440.Reschedule Meetings for Maximum Free Time II
1 parent d7fddea commit 8b4d7ac

File tree

8 files changed

+681
-128
lines changed

8 files changed

+681
-128
lines changed

solution/3400-3499/3440.Reschedule Meetings for Maximum Free Time II/README.md

Lines changed: 240 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)