LeetCode 题解工作台

无需开会的工作日

给你一个正整数 days ,表示员工可工作的总天数(从第 1 天开始)。另给你一个二维数组 meetings ,长度为 n ,其中 meetings[i] = [start_i, end_i] 表示第 i 次会议的开始和结束天数(包含首尾)。 返回员工可工作且没有安排会议的天数。 注意: 会议时间可…

category

2

题型

code_blocks

6

代码语言

hub

3

相关题

当前训练重点

中等 · 数组·排序

bolt

答案摘要

我们不妨将所有会议按照开始时间排序,用一个变量 记录此前会议的最晚结束时间。 然后我们遍历所有会议,对于每一个会议 $(\textit{st}, \textit{ed})$,如果 $\textit{last} < \textit{st}$,说明 到 之间的时间段是员工可以工作且没有安排会议的时间,我们将这段时间加入答案。然后我们更新 $\textit{last} = \max(\textit…

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 数组·排序 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个正整数 days,表示员工可工作的总天数(从第 1 天开始)。另给你一个二维数组 meetings,长度为 n,其中 meetings[i] = [start_i, end_i] 表示第 i 次会议的开始和结束天数(包含首尾)。

返回员工可工作且没有安排会议的天数。

注意:会议时间可能会有重叠。

 

示例 1:

输入:days = 10, meetings = [[5,7],[1,3],[9,10]]

输出:2

解释:

第 4 天和第 8 天没有安排会议。

示例 2:

输入:days = 5, meetings = [[2,4],[1,3]]

输出:1

解释:

第 5 天没有安排会议。

示例 3:

输入:days = 6, meetings = [[1,6]]

输出:0

解释:

所有工作日都安排了会议。

 

提示:

  • 1 <= days <= 109
  • 1 <= meetings.length <= 105
  • meetings[i].length == 2
  • 1 <= meetings[i][0] <= meetings[i][1] <= days
lightbulb

解题思路

方法一:排序

我们不妨将所有会议按照开始时间排序,用一个变量 last\textit{last} 记录此前会议的最晚结束时间。

然后我们遍历所有会议,对于每一个会议 (st,ed)(\textit{st}, \textit{ed}),如果 last<st\textit{last} < \textit{st},说明 last\textit{last}st\textit{st} 之间的时间段是员工可以工作且没有安排会议的时间,我们将这段时间加入答案。然后我们更新 last=max(last,ed)\textit{last} = \max(\textit{last}, \textit{ed})

最后,如果 last<days\textit{last} < \textit{days},说明最后一次会议结束后还有时间段是员工可以工作且没有安排会议的时间,我们将这段时间加入答案。

时间复杂度 O(n×logn)O(n \times \log n),空间复杂度 O(logn)O(\log n)。其中 nn 为会议的数量。

1
2
3
4
5
6
7
8
9
10
11
class Solution:
    def countDays(self, days: int, meetings: List[List[int]]) -> int:
        meetings.sort()
        ans = last = 0
        for st, ed in meetings:
            if last < st:
                ans += st - last - 1
            last = max(last, ed)
        ans += days - last
        return ans
speed

复杂度分析

指标
时间O(N \cdot log(N))
空间O(\log⁡⁡ N)
psychology

面试官常问的追问

外企场景
  • question_mark

    Can the candidate explain how sorting affects the merging process?

  • question_mark

    How well does the candidate handle large input sizes efficiently?

  • question_mark

    Is the candidate able to handle edge cases, such as no meetings or full-day meetings?

warning

常见陷阱

外企场景
  • error

    Forgetting to merge overlapping meetings before counting the free days.

  • error

    Incorrectly handling edge cases like no free days or all days being booked.

  • error

    Misunderstanding the problem and incorrectly returning the days with meetings instead of without.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    What if meetings are given in a random order?

  • arrow_right_alt

    How would the solution change if the input days were larger?

  • arrow_right_alt

    What if meetings don't overlap at all?

help

常见问题

外企场景

无需开会的工作日题解:数组·排序 | LeetCode #3169 中等