-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy pathreschedule-meetings-for-maximum-free-time-ii.cpp
37 lines (35 loc) · 1.25 KB
/
reschedule-meetings-for-maximum-free-time-ii.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
// Time: O(n)
// Space: O(1)
// array
class Solution {
public:
int maxFreeTime(int eventTime, vector<int>& startTime, vector<int>& endTime) {
const auto& topk = [&](int k) { // Time: O(k * n)
vector<pair<int, int>> topk(k, pair(numeric_limits<int>::min(), numeric_limits<int>::min()));
for (int i = 0; i < size(startTime); ++i) {
auto x = pair(startTime[i] - endTime[i], endTime[i]);
for (auto& y : topk) {
if (x > y) {
swap(x, y);
}
}
}
return topk;
};
startTime.emplace_back(eventTime);
endTime.emplace(begin(endTime), 0);
const auto& top3 = topk(3);
int result = 0;
for (int i = 0, curr = 0; i + 1 < size(startTime); ++i) {
int l = 0;
for (const auto& [mx, e] : top3) {
if (e != endTime[i] && e != endTime[i+1] && endTime[i + 1] - startTime[i] <= mx) {
l = endTime[i+1] - startTime[i];
break;
}
}
result = max(result, (startTime[i] - endTime[i]) + (startTime[i + 1] - endTime[i + 1]) + l);
}
return result;
}
};