题目详情
给定一个会议时间安排的数组 intervals
,每个会议时间包括开始和结束时间 intervals[i] = [startᵢ, endᵢ]
(满足 startᵢ < endᵢ
)。请你判断一个人是否能够参加所有会议(即会议时间是否存在重叠冲突)。
示例 1:
输入:intervals = [[0,30],[5,10],[15,20]]
输出:false
解释:存在时间重叠,无法同时参加所有会议。
*示例 2:
输入:intervals = [[7,10],[2,4]]
输出:true
解释:会议[2,4]结束后可参加[7,10],无冲突。
提示:
0 <= intervals.length <= 10⁴
intervals[i].length == 2
0 <= startᵢ < endᵢ <= 10⁶
解题思路
核心问题是判断所有会议时间区间是否互不重叠,步骤如下:
- 排序:按会议开始时间升序排序。
- 相邻检查:遍历排序后的会议,检查当前会议的开始时间是否早于前一会议的结束时间(即
intervals[i][0] < intervals[i-1][1]
):- 若成立,说明存在重叠,返回
false
。 - 否则继续遍历,全部通过则返回
true
。
- 若成立,说明存在重叠,返回
算法正确性证明: 排序后,会议按开始时间有序。若相邻两个会议发生重叠(即后一会议在前一会议结束前开始),则整个序列必然存在冲突;若所有相邻会议均无重叠,则全局无冲突。
复杂度分析: 时间复杂度:O(n log n),排序消耗 O(n log n),遍历消耗 O(n)。空间复杂度:O(1),忽略排序的栈空间(若排序使用堆排序则为 O(1))。
代码实现(Java版)
public class Solution {
public boolean canAttendMeetings(int[][] intervals) {
// 处理边界:空数组或无会议时返回 true
if (intervals == null || intervals.length <= 1) {
return true;
}
// 按会议开始时间升序排序
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
// 遍历检查相邻会议是否重叠
for (int i = 1; i < intervals.length; i++) {
// 当前会议开始时间 < 前一会议结束时间 → 冲突
if (intervals[i][0] < intervals[i - 1][1]) {
return false;
}
}
return true;
}
}
代码说明
- 边界处理:
- 空数组(
intervals.length = 0
)或单会议(length = 1
)默认无冲突,直接返回true
。
- 空数组(
- 排序逻辑:
- 使用 Lambda 表达式
(a, b) -> Integer.compare(a[0], b[0])
按开始时间升序排序。
- 使用 Lambda 表达式
- 重叠判断:
- 只需比较当前会议开始时间(
intervals[i][0]
)与前一个会议结束时间(intervals[i-1][1]
)。 - 若当前会议在前一会议结束前开始(
<
而非<=
),判定为重叠(因会议结束时才能参加下一个)。
- 只需比较当前会议开始时间(