如何用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;
}
}
三、代码解析
- 空数组检查:
if (intervals == null || intervals.length == 0) {
return true;
}
这段代码首先检查 intervals
是否为空或长度为零。如果是这种情况,那就意味着没有会议需要参加,自然可以返回 true
。
- 数组排序:
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
这里使用 Arrays.sort
方法对 intervals
数组进行排序,排序依据是会议的开始时间 a[0]
。这样排序后,我们就可以方便地按顺序检查会议时间是否重叠。
- 检查重叠:
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
。
- 返回结果:
return true;
如果遍历完整个数组都没有发现重叠的会议,那就返回 true
,表示可以参加所有会议。
四、复杂度分析
- 时间复杂度:排序操作的时间复杂度为 O(n log n),其中 n 是会议的数量。之后的遍历操作时间复杂度为 O(n),整体时间复杂度取决于排序操作,所以为 O(n log n)。
- 空间复杂度:代码中除了输入的数组外,没有使用额外与输入规模相关的空间,所以空间复杂度为 O(1)。
通过这样的代码和分析,我们就可以高效地判断能否参加所有会议啦。希望大家对这个算法问题有更清晰的理解!
以上就是本次分享的全部内容,如果你有任何疑问或想法,欢迎在留言区交流~