Hello world!

100311. 无需开会的工作日

题目描述

给你一个正整数 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;
    }
};
posted @   Eaven_Wang  阅读(18)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示