3439. 重新安排会议得到最多空余时间 I
给你一个整数
eventTime表示一个活动的总时长,这个活动开始于t = 0,结束于t = eventTime。同时给你两个长度为
n的整数数组startTime和endTime。它们表示这次活动中n个时间没有重叠的会议,其中第i个会议的时间为[startTime[i], endTime[i]]。你可以重新安排至多
k个会议,安排的规则是将会议时间平移,且保持原来的会议时长,你的目的是移动会议后最大化相邻两个会议之间的最长连续空余时间。移动前后所有会议之间的相对顺序需要保持不变,而且会议时间也需要保持互不重叠。
请你返回重新安排会议以后,可以得到的最大空余时间。
注意,会议不能安排到整个活动的时间以外。
示例 1:
输入:eventTime = 5, k = 1, startTime = [1,3], endTime = [2,5]
输出:2
解释:
将
[1, 2]的会议安排到[2, 3],得到空余时间[0, 2]。示例 2:
输入:eventTime = 10, k = 1, startTime = [0,2,9], endTime = [1,4,10]
输出:6
解释:
将
[2, 4]的会议安排到[1, 3],得到空余时间[3, 9]。示例 3:
class Solution { public: int maxFreeTime(int eventTime, int k, vector<int>& startTime, vector<int>& endTime) { // 初始化一个空余事件数组 int n = startTime.size(); vector<int> free(n+1); free[0] = startTime[0]; for(int i = 1; i < n; i++) { free[i] = startTime[i] - endTime[i-1]; } free[n] = eventTime-endTime[n-1]; // 在空余时间数组里 选择窗口大小为k+1时的最大值 int left = 0, right = 0; int sum = 0, res = 0; while(right < n+1) { sum += free[right]; if(right < k) { right++; continue; } res = max(res, sum); sum -= free[left]; left++; right++; } return res; } };