题目记录
3169. 无需开会的工作日
给你一个正整数 days,表示员工可工作的总天数(从第 1 天开始)。另给你一个二维数组 meetings,长度为 n,其中 meetings[i] = [start_i, end_i] 表示第 i 次会议的开始和结束天数(包含首尾)。
返回员工可工作且没有安排会议的天数。
注意: 会议时间可能会有重叠。
输入 days = 10, meetings =[[5,7],[1,3],[9,10]
输出2 第 4 天和第 8 天没有安排会议。
提示
1 <= days <= 1091 <= meetings.length <= 105meetings[i].length == 21 <= meetings[i][0] <= meetings[i][1] <= days
答案记录 #include #include
using namespace std;
class Solution { public: int countDays(int days, vector<vector>& meetings) { // 边界情况:无会议时,所有天数均空闲 if (meetings.empty()) { return days; }
// 按会议开始时间升序排序
sort(meetings.begin(), meetings.end(), [](const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
});
// 合并重叠或相邻的区间
vector<vector<int>> merged;
merged.push_back(meetings[0]); // 初始化合并列表
for (int i = 1; i < meetings.size(); ++i) {
int currStart = meetings[i][0];
int currEnd = meetings[i][1];
vector<int>& lastInterval = merged.back(); // 引用最后一个合并的区间
int lastEnd = lastInterval[1];
// 若当前区间与最后合并区间不重叠且不相邻,则加入新区间
if (currStart > lastEnd + 1) {
merged.push_back(meetings[i]);
} else {
// 否则合并区间,更新结束时间为较大值
lastInterval[1] = max(lastEnd, currEnd);
}
}
// 计算所有合并区间覆盖的总天数
int totalCovered = 0;
for (const auto& interval : merged) {
totalCovered += interval[1] - interval[0] + 1;
}
// 空闲天数 = 总天数 - 总覆盖天数
return days - totalCovered;
}
};