You are given a positive integer days representing the total number of days an employee is available for work (starting from day 1). You are also given a 2D array meetings of size n where, meetings[i] = [start_i, end_i] represents the starting and ending days of meeting i (inclusive).
Return the count of days when the employee is available for work but no meetings are scheduled.
Note: The meetings may overlap.
Example 1:
Input: days = 10, meetings = [[5,7],[1,3],[9,10]] Output: 2 Explanation: There is no meeting scheduled on the 4th and 8th days.
Example 2:
Input: days = 5, meetings = [[2,4],[1,3]] Output: 1 Explanation: There is no meeting scheduled on the 5th day.
Example 3:
Input: days = 6, meetings = [[1,6]] Output: 0 Explanation: Meetings are scheduled for all working days.
Constraints:
1 <= days <= 1091 <= meetings.length <= 105meetings[i].length == 21 <= meetings[i][0] <= meetings[i][1] <= days
Approach 01:
-
C++
-
Python
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int countDays(int totalDays, vector<vector<int>>& meetings) {
if (meetings.empty())
return totalDays;
sort(meetings.begin(), meetings.end());
vector<vector<int>> mergedMeetings;
for (const vector<int>& meeting : meetings) {
if (mergedMeetings.empty()) {
mergedMeetings.push_back(meeting);
} else {
int lastStart = mergedMeetings.back()[0];
int lastEnd = mergedMeetings.back()[1];
int currentStart = meeting[0];
int currentEnd = meeting[1];
if (currentStart <= lastEnd + 1) {
mergedMeetings.back()[1] = max(lastEnd, currentEnd);
} else {
mergedMeetings.push_back(meeting);
}
}
}
int freeDays = 0;
int previousEnd = 0;
for (const vector<int>& meeting : mergedMeetings) {
int start = meeting[0];
int end = meeting[1];
freeDays += start - previousEnd - 1;
previousEnd = max(previousEnd, end);
}
freeDays += totalDays - previousEnd;
return freeDays;
}
};
from typing import List
class Solution:
def countDays(self, totalDays: int, meetings: List[List[int]]) -> int:
if not meetings:
return totalDays
meetings.sort()
mergedMeetings = []
for meeting in meetings:
if not mergedMeetings:
mergedMeetings.append(meeting)
else:
lastStart, lastEnd = mergedMeetings[-1]
currentStart, currentEnd = meeting
if currentStart <= lastEnd + 1:
mergedMeetings[-1] = [lastStart, max(lastEnd, currentEnd)]
else:
mergedMeetings.append(meeting)
freeDays = 0
previousEnd = 0
for start, end in mergedMeetings:
freeDays += start - previousEnd - 1
previousEnd = max(previousEnd, end)
freeDays += totalDays - previousEnd
return freeDays
Time Complexity:
- Sorting:
The meetings are sorted based on their start times, which takes \( O(m \log m) \), where \( m \) is the number of meetings.
- Merging Intervals:
Each meeting is processed once while merging, leading to \( O(m) \) complexity.
- Calculating Free Days:
Iterating over the merged intervals takes \( O(m) \).
- Total Time Complexity:
The overall time complexity is \( O(m \log m) \).
Space Complexity:
- Sorting Overhead:
The sorting algorithm typically requires \( O(m) \) auxiliary space.
- Merged Meetings Storage:
A separate list is maintained for merged intervals, taking \( O(m) \) space.
- Total Space Complexity:
The overall space complexity is \( O(m) \).