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