You are given an integer eventTime denoting the duration of an event, where the event occurs from time t = 0 to time t = eventTime.
You are also given two integer arrays startTime and endTime, each of length n. These represent the start and end time of nnon-overlapping meetings, where the ith meeting occurs during the time [startTime[i], endTime[i]].
You can reschedule at mostk meetings by moving their start time while maintaining the same duration , to maximize the longestcontinuous period of free time during the event.
The relative order of all the meetings should stay the same and they should remain non-overlapping.
Return the maximum amount of free time possible after rearranging the meetings.
Note that the meetings can not be rescheduled to a time outside the event.
Input: eventTime =5, k =1, startTime =[1,3], endTime =[2,5]Output: 2Explanation:
Reschedule the meeting at `[1, 2]` to `[2, 3]`, leaving no meetings during the time `[0, 2]`.
Input: eventTime =10, k =1, startTime =[0,2,9], endTime =[1,4,10]Output: 6Explanation:
Reschedule the meeting at `[2, 4]` to `[1, 3]`, leaving no meetings during the time `[3, 9]`.
Input: eventTime =5, k =2, startTime =[0,1,2,3,4], endTime =[1,2,3,4,5]Output: 0Explanation:
There is no time during the event not occupied by meetings.
The free time is the gap between meetings. By rescheduling up to k meetings, we can “merge” up to k gaps, maximizing the largest continuous free time. This is a classic sliding window of size n-k+1 over the gaps.
classSolution {
publicintmaxFreeTime(int eventTime, int k, int[] startTime, int[] endTime) {
int n = startTime.length;
int[] gaps =newint[n + 1];
// Before first meeting gaps[0]= startTime[0]- 0;
// Between meetingsfor (int i = 1; i < n; i++) {
gaps[i]= startTime[i]- endTime[i - 1];
}
// After last meeting gaps[n]= eventTime - endTime[n - 1];
int window = k + 1;
int curr = 0;
for (int i = 0; i < window; i++) curr += gaps[i];
int maxSum = curr;
for (int i = window; i < gaps.length; i++) {
curr += gaps[i]- gaps[i - window];
maxSum = Math.max(maxSum, curr);
}
return maxSum;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
funmaxFreeTime(eventTime: Int, k: Int, startTime: IntArray, endTime: IntArray): Int {
val n = startTime.size
val gaps = IntArray(n + 1)
gaps[0] = startTime[0] - 0for (i in1 until n) {
gaps[i] = startTime[i] - endTime[i - 1]
}
gaps[n] = eventTime - endTime[n - 1]
val window = k + 1var curr = 0for (i in0 until window) curr += gaps[i]
var maxSum = curr
for (i in window until gaps.size) {
curr += gaps[i] - gaps[i - window]
maxSum = maxOf(maxSum, curr)
}
return maxSum
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
defmaxFreeTime(eventTime, k, startTime, endTime):
n = len(startTime)
# Compute all gaps gaps = []
# Before first meeting gaps.append(startTime[0] -0)
# Between meetingsfor i in range(1, n):
gaps.append(startTime[i] - endTime[i-1])
# After last meeting gaps.append(eventTime - endTime[-1])
# Sliding window of size k+1 window = k +1 max_sum = curr = sum(gaps[:window])
for i in range(window, len(gaps)):
curr += gaps[i] - gaps[i-window]
max_sum = max(max_sum, curr)
return max_sum
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
pubfnmax_free_time(event_time: i32, k: i32, start_time: Vec<i32>, end_time: Vec<i32>) -> i32 {
let n = start_time.len();
letmut gaps =vec![0; n +1];
gaps[0] = start_time[0];
for i in1..n {
gaps[i] = start_time[i] - end_time[i -1];
}
gaps[n] = event_time - end_time[n -1];
let window = (k +1) asusize;
letmut curr: i32= gaps[..window].iter().sum();
letmut max_sum = curr;
for i in window..gaps.len() {
curr += gaps[i] - gaps[i - window];
if curr > max_sum {
max_sum = curr;
}
}
max_sum
}