个人记录1 25.7.12

45 阅读1分钟

题目记录 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 <= 109
  • 1 <= meetings.length <= 105
  • meetings[i].length == 2
  • 1 <= 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;
}

};