題目描述
給你一個正整數 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;
}
};