给定一个会议时间安排的数组 intervals
,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi]
,请你判断一个人是否能够参加这里面的全部会议。
示例 1:
输入:intervals = [[0,30],[5,10],[15,20]] 输出:false
示例 2:
输入:intervals = [[7,10],[2,4]] 输出:true
提示:
0 <= intervals.length <= 10^4
intervals[i].length == 2
0 <= starti < endi <= 10^6
解法1:差分数组
会议将会在 左开右闭 时间区间 [starti, endi)
举办。
类似题型:LeetCode 253. 会议室 II-CSDN博客
Java版:
class Solution {
public boolean canAttendMeetings(int[][] intervals) {
int m = intervals.length;
int mint = Integer.MAX_VALUE;
int maxt = Integer.MIN_VALUE;
for (int[] interval: intervals) {
mint = Math.min(mint, interval[0]);
maxt = Math.max(maxt, interval[1]);
}
int n = maxt - mint + 1;
int[] diff = new int[n];
for (int[] interval : intervals) {
diff[interval[0] - mint]++;
diff[interval[1] - mint]--;
}
for (int i = 1; i < n; i++) {
diff[i] += diff[i - 1];
if (diff[i] > 1) {
return false;
}
}
return true;
}
}
Python3版:
class Solution:
def canAttendMeetings(self, intervals: List[List[int]]) -> bool:
m = len(intervals)
if m == 0:
return True
mint = inf
maxt = -inf
for start, end in intervals:
mint = min(mint, start)
maxt = max(maxt, end)
n = maxt - mint + 1
diff = [0] * n
for start, end in intervals:
diff[start - mint] += 1
diff[end - mint] -= 1
for i in range(1, n):
diff[i] += diff[i - 1]
if diff[i] > 1:
return False
return True
复杂度分析
- 时间复杂度:O(m + n),其中 m 是数组 intervals 的长度,n 是差分数组 diff 的长度。
- 空间复杂度:O(n),n 是差分数组 diff 的长度。