Skip to content

Commit e8ae270

Browse files
committed
Time: 25 ms (26.72%) | Memory: 65.8 MB (7.76%) - LeetSync
1 parent 4e55dc1 commit e8ae270

File tree

1 file changed

+69
-0
lines changed

1 file changed

+69
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
2+
class Solution {
3+
public int maxFreeTime(int eventTime, int[] startTime, int[] endTime) {
4+
int n = startTime.length;
5+
6+
// Original gaps
7+
List<int[]> gaps = new ArrayList<>();
8+
9+
// gap before first meeting
10+
if (startTime[0] > 0) {
11+
gaps.add(new int[]{0, startTime[0]});
12+
}
13+
14+
// gaps between meetings
15+
for (int i = 1; i < n; i++) {
16+
if (startTime[i] > endTime[i - 1]) {
17+
gaps.add(new int[]{endTime[i - 1], startTime[i]});
18+
}
19+
}
20+
21+
// gap after last meeting
22+
if (eventTime > endTime[n - 1]) {
23+
gaps.add(new int[]{endTime[n - 1], eventTime});
24+
}
25+
26+
// Sort gaps by size descending to optimize search (early termination)
27+
gaps.sort((a, b) -> Integer.compare(b[1] - b[0], a[1] - a[0]));
28+
29+
// Get max original gap
30+
int maxGap = gaps.isEmpty() ? 0 : gaps.get(0)[1] - gaps.get(0)[0];
31+
32+
// Try rescheduling each meeting
33+
for (int i = 0; i < n; i++) {
34+
int dur = endTime[i] - startTime[i];
35+
36+
// Remove current meeting and create merged gap
37+
int left = (i == 0) ? 0 : endTime[i - 1];
38+
int right = (i == n - 1) ? eventTime : startTime[i + 1];
39+
int mergedGap = right - left;
40+
41+
// Case 1: Place meeting back in the merged gap itself
42+
if (mergedGap >= dur) {
43+
maxGap = Math.max(maxGap, mergedGap - dur);
44+
}
45+
46+
// Case 2: Try placing this meeting in any other gap
47+
// Optimization: early termination since gaps are sorted by size
48+
for (int[] gap : gaps) {
49+
int gapLen = gap[1] - gap[0];
50+
51+
// If this gap is too small, all following gaps will be too small
52+
if (gapLen < dur) {
53+
break;
54+
}
55+
56+
// Check if this gap overlaps with the merged gap
57+
boolean overlapsMerged = !(gap[1] <= left || gap[0] >= right);
58+
59+
if (!overlapsMerged) {
60+
// Independent gap - we can place the meeting here
61+
maxGap = Math.max(maxGap, mergedGap);
62+
break; // Found optimal solution for this meeting
63+
}
64+
}
65+
}
66+
67+
return maxGap;
68+
}
69+
}

0 commit comments

Comments
 (0)