【简单】力扣算法题解析LeetCode252:会议室

关注底部名片达文汐,即可获得本题完整源码

题目详情

给定一个会议时间安排的数组 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⁶

解题思路

核心问题是判断所有会议时间区间是否互不重叠,步骤如下:

  1. 排序:按会议开始时间升序排序。
  2. 相邻检查:遍历排序后的会议,检查当前会议的开始时间是否早于前一会议的结束时间(即 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;
    }
}

代码说明

  1. 边界处理
    • 空数组(intervals.length = 0)或单会议(length = 1)默认无冲突,直接返回 true
  2. 排序逻辑
    • 使用 Lambda 表达式 (a, b) -> Integer.compare(a[0], b[0]) 按开始时间升序排序。
  3. 重叠判断
    • 只需比较当前会议开始时间(intervals[i][0])与前一个会议结束时间(intervals[i-1][1])。
    • 若当前会议在前一会议结束前开始(< 而非 <=),判定为重叠(因会议结束时才能参加下一个)。

在这里插入图片描述

我的名片👇👇👇👇👇👇👇👇👇👇👇

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值