100311. 無需開會的工作日

Eaven_Wang發表於2024-06-02

題目描述

給你一個正整數 days,表示員工可工作的總天數(從第 1 天開始)。另給你一個二維陣列 meetings,長度為 n,其中 meetings[i] = [start_i, end_i] 表示第 i 次會議的開始和結束天數(包含首尾)。

返回員工可工作且沒有安排會議的天數。

注意:會議時間可能會有重疊。

情況描述

6月2日周賽只做出來一個題

思路

  • 先按開會開始時間排序,再按開會結束時間排序,這樣如果日期有重疊,那麼一定是相鄰的。用count記錄開會的天數,初始化為第一次開會的天數
  • 用一個區間記錄最近的會議起止時間,start記錄會議開始事件,初始化為第一次會議開始時間,end記錄會議結束時間,初始化為第一次會議結束時間。下一次會議到來時,分三種情況:
    1. 開始時間大於等於start,結束時間小於等於end,完全重疊,這說明下一次會議完全在當前會議時間的範圍之內,count不用改變,直接略過即可。
    2. 開始時間小於等於end,結束時間大於等於end,這說明部分重疊,開會天數只用加上比當前會議多出的天數即可,count += (meetings[i][1] - end),並且更新end為meetings[i][1]
    3. 開始時間大於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;
    }
};

相關文章