class Solution {
public:
int maxFreeTime(int eventTime, int k, vector<int>& startTime, vector<int>& endTime) {
int longestFreeTime = 0;
vector<vector<int>> meetings{};
// Put in fake first meeting that starts at time -1, ends at time 0.
meetings.push_back(vector<int>{-1, 0});
for(int ii=0; ii<startTime.size(); ++ii)
{
longestFreeTime = std::max(longestFreeTime, startTime[ii] - meetings[meetings.size()-1][1]);
meetings.push_back(vector<int>{startTime[ii], endTime[ii]});
}
// Put in fake last meeting that starts at time eventTime, and ends at time eventTime+1
meetings.push_back(vector<int>{eventTime, eventTime+1});
longestFreeTime = std::max(longestFreeTime, meetings[meetings.size()-1][0] - meetings[meetings.size()-2][1]);
// For the first k meetings, the meetingMinutesInRange is the sum of the number of minutes in those meetings.
int meetingMinutesInRange = 0;
int rangeCount = 0;
while(rangeCount < k)
{
meetingMinutesInRange += meetings[rangeCount][1] - meetings[rangeCount][0];
++rangeCount;
}
// range [lo, hi] is range[firstMeeting in range, lastMeeting in range].
int lo = 1;
int hi = lo + k - 1;
// For each iteration there is a range of meetings that can be moved. They are
// the meetings lo to hi in meetings vector.
// The total time that these meetings have is the end of the last range and
// the start of the next range.
// Or the total time is the end_time of meeting[lo-1] to the start_time of meeting[hi+1];
// The total free_time that can be found in the total_time is the total_time minus
// the sum_of_the_minutes_in_the_meeting_range.
// I can move k meetings (there are k meetings in the range). I choose to
// move all the meetings to one side, then the resulting free time is
// total_time minus sum_of_meeting_times.
while(hi < meetings.size()-1)
{
int lastMeetingEnded = meetings[lo-1][1];
int nextMeetingStarts = meetings[hi + 1][0];
meetingMinutesInRange = meetingMinutesInRange -
(meetings[lo-1][1] - meetings[lo-1][0]) +
(meetings[hi][1] - meetings[hi][0]);
int newLongestFreeTime = nextMeetingStarts -
lastMeetingEnded -
meetingMinutesInRange;
longestFreeTime = std::max(longestFreeTime, newLongestFreeTime);
++lo;
++hi;
}
return longestFreeTime;
}
};