题目描述
给你一个正整数 days,表示员工可工作的总天数(从第 1 天开始)。另给你一个二维数组 meetings,长度为 n,其中 meetings[i] = [start_i, end_i] 表示第 i 次会议的开始和结束天数(包含首尾)。
返回员工可工作且没有安排会议的天数。
注意:会议时间可能会有重叠。
情况描述
6月2日周赛只做出来一个题
思路
- 先按开会开始时间排序,再按开会结束时间排序,这样如果日期有重叠,那么一定是相邻的。用count记录开会的天数,初始化为第一次开会的天数
- 用一个区间记录最近的会议起止时间,start记录会议开始事件,初始化为第一次会议开始时间,end记录会议结束时间,初始化为第一次会议结束时间。下一次会议到来时,分三种情况:
- 开始时间大于等于start,结束时间小于等于end,完全重叠,这说明下一次会议完全在当前会议时间的范围之内,count不用改变,直接略过即可。
- 开始时间小于等于end,结束时间大于等于end,这说明部分重叠,开会天数只用加上比当前会议多出的天数即可,count += (meetings[i][1] - end),并且更新end为meetings[i][1]
- 开始时间大于end,说明没有发生重叠,更新start和end,count += (start - end + 1)
代码
class Solution {
public:
static bool cmp(const vector<int>& a,const vector<int>& b){
if (a[0] == b[0]) {
return a[1] < b[1];
}
return a[0] < b[0];
}
int countDays(int days, vector<vector<int>>& meetings) {
int n = meetings.size();
sort(meetings.begin(),meetings.end(),cmp);
int start = meetings[0][0];
int end = meetings[0][1];;
int count = end - start + 1;
for(int i = 1;i < n;i++){
if(meetings[i][0] <= end && meetings[i][1] <= end) continue;
if(meetings[i][0] <= end && meetings[i][1] >= end) {
count += (meetings[i][1] - end);
end = meetings[i][1];
}else{
start = meetings[i][0];
end = meetings[i][1];
count += (end - start + 1);
}
}
return days - count;
}
};
标签:count,无需,end,int,天数,meetings,start,开会,100311
From: https://www.cnblogs.com/EavenWang/p/18227532