LeetCode 252简单区间
会议室 图解题解
这道题到底在问什么
给会议时间,判断一个人能否参加全部会议。
- 示例
- [[0,30],[5,10],[15,20]] → false
最优解:一步一步想明白
- 3两两比较所有会议是 O(n²)。
- 4按开始时间排序后,只需要检查相邻会议是否前一个结束晚于后一个开始。
- 5排序是关键:把可能冲突的会议排到相邻位置。
- 6重叠判断只看「后场开始 vs 前场结束」。
- 7后场开始 < 前场结束 = 冲突。
- 8有一处冲突,整体就不能全参加。
- 9排序后相邻都不撞,才说明全部能参加。
- 12一句话记住:按开始时间排序后,只需要检查相邻会议是否前一个结束晚于后一个开始。
- 15排序把 O(n²) 两两比较降成 O(n) 只比相邻。
- 22这题学完不要乱跳,下一步去对应专题 /leetcode-animation/ds?k=interval 连刷同类题;卡住时用 AI 答疑问“我的状态定义哪里不稳”。
⚠️ 容易写错的地方
✗ 错:不排序直接两两比较
✓ 对:先按 start 排序,再只查相邻
排序后相邻不撞即全局不撞,O(n);不排序两两比要 O(n²)。
✗ 错:重叠判成 start ≤ prevEnd
✓ 对:用 start < prevEnd(边界相接不算撞)
[1,5] 与 [5,8] 在 5 点首尾相接、不冲突;只有严格 start < prevEnd 才重叠。
✗ 错:误按「结束时间」排序
✓ 对:按 start(区间首元素)排序
本题相邻判断的前提是开始时间有序;按 end 排会打乱这个前提。
完整代码(Python / C++ / Java)
Python
class Solution:
def canAttendMeetings(self, intervals):
intervals.sort()
for i in range(1, len(intervals)):
if intervals[i][0] < intervals[i - 1][1]:
return False
return TrueC++
class Solution {
public:
bool canAttendMeetings(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());
for (int i=1;i<intervals.size();i++) if (intervals[i][0] < intervals[i-1][1]) return false;
return true;
}
};Java
class Solution {
public boolean canAttendMeetings(int[][] intervals) {
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
for (int i=1;i<intervals.length;i++) if (intervals[i][0] < intervals[i-1][1]) return false;
return true;
}
}套路模板 · 区间重叠判定骨架
# 区间无重叠判定 骨架
intervals.sort() # 按 start 排序
for i in range(1, len(intervals)):
if intervals[i][0] < intervals[i-1][1]: # 后场开始 < 前场结束
return False # 重叠 → 不能全参加
return True复杂度
时间复杂度
O(n log n)
排序主导;之后一趟线性扫描相邻区间
空间复杂度
O(log n)
排序递归栈(原地排序,不算输入)
看不够?换成动画再走一遍
上面的推演每一步都对应一帧动画。点开交互动画版,能一步步看着 会议室 的数据怎么变、指针怎么走,还能切 Python / Java / C++ 跟着练。
面试官可能追问
整体思路是什么?+
按开始时间排序后一趟扫描:若某场的 start < 前一场的 end,说明两场重叠、无法全部参加,返回 false;扫到底都不重叠则 true。
这道题为什么用「区间」,换最直接的暴力解会差在哪?+
区间抓住了本题的结构特征,把暴力解里重复的工作省掉;暴力解通常要多嵌套一层枚举,数据一大就超时。具体对比见上文「暴力解及其卡点」与「最优解逐步推演」两节。
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。