如何用Java判断能否参加所有会议:解析「会议室」问题

如何用Java判断能否参加所有会议:解析「会议室」问题

一、问题引入

在日常生活和工作中,我们常常需要安排各种会议,有时候会面临会议时间冲突的困扰。今天,我们就通过一道算法题,来看看如何用Java代码判断一个人是否能够参加给定的所有会议。

给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,我们要判断一个人是否能够参加这里面的全部会议。例如:

  • 示例1
    • 输入:intervals = [[0,30],[5,10],[15,20]]
    • 输出:false,因为 [5,10] 和 [15,20] 都在 [0,30] 这个时间段内,存在时间冲突,无法全部参加。

  • 示例2
    • 输入:intervals = [[7,10],[2,4]]
    • 输出:true,这两个会议时间没有冲突,可以全部参加。

二、代码实现

package _252;
import java.util.*;

class Solution {
    public boolean canAttendMeetings(int[][] intervals) {
        if (intervals == null || intervals.length == 0) {
            return true;
        }

        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;
    }
}

三、代码解析

  1. 空数组检查
if (intervals == null || intervals.length == 0) {
    return true;
}

这段代码首先检查 intervals 是否为空或长度为零。如果是这种情况,那就意味着没有会议需要参加,自然可以返回 true

  1. 数组排序
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));

这里使用 Arrays.sort 方法对 intervals 数组进行排序,排序依据是会议的开始时间 a[0]。这样排序后,我们就可以方便地按顺序检查会议时间是否重叠。

  1. 检查重叠
for (int i = 1; i < intervals.length; i++) {
    if (intervals[i][0] < intervals[i - 1][1]) {
        return false;
    }
}

通过遍历排序后的 intervals 数组,从第二个会议开始(i = 1),检查当前会议的开始时间 intervals[i][0] 是否早于前一个会议的结束时间 intervals[i - 1][1]。如果存在这种情况,说明有会议时间重叠,就返回 false

  1. 返回结果
return true;

如果遍历完整个数组都没有发现重叠的会议,那就返回 true,表示可以参加所有会议。

四、复杂度分析

  • 时间复杂度:排序操作的时间复杂度为 O(n log n),其中 n 是会议的数量。之后的遍历操作时间复杂度为 O(n),整体时间复杂度取决于排序操作,所以为 O(n log n)。
  • 空间复杂度:代码中除了输入的数组外,没有使用额外与输入规模相关的空间,所以空间复杂度为 O(1)。

通过这样的代码和分析,我们就可以高效地判断能否参加所有会议啦。希望大家对这个算法问题有更清晰的理解!

以上就是本次分享的全部内容,如果你有任何疑问或想法,欢迎在留言区交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值