題目 #
leetcode 252 - Meeting Rooms(題目說明請點連結)
題目簡述 #
判斷是否可以參加所有會議。
Example 1:
Input: intervals = [[0,30],[5,10],[15,20]]
Output: false
Explanation: 該人員無法參加所有會議,因為會議 [0,30] 和 [5,10] 之間存在衝突。會議 [0,30] 在時間 30 結束,而會議 [5,10] 在時間 5 開始,這表示它們有重疊。Example 2:
Input: intervals = [[7,10],[2,4]]
Output: true
Explanation: 該人員可以參加所有會議,因為會議之間沒有重疊。解題思路 #
輸入為一個會議時間區間的陣列,輸出為是否可以參加所有會議。
這題可以用排序的解法去實作。
以下面為例子:
將所有會議按照開始時間排序,然後檢查相鄰的會議是否有重疊。
| 步驟 | 會議狀態 | 操作說明 |
|---|---|---|
| Step 1 | [[0,30],[5,10],[15,20]] | 原始會議陣列 |
| Step 2 | [[0,30],[5,10],[15,20]] | 按照開始時間排序(已經排序) |
| Step 3 | 比較 [0,30] 和 [5,10] | 前一個會議結束時間(30) > 當前會議開始時間(5) |
| 發現重疊,返回 false |
完整程式碼 #
java
class Solution {
public boolean canAttendMeetings(int[][] intervals) {
// 如果沒有會議或只有一個,直接返回 true
if (intervals == null || intervals.length <= 1) {
return true;
}
// 按照每個會議的開始時間排序
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
// 檢查是否有重疊的會議
for (int i = 1; i < intervals.length; i++) {
// 若前一個會議的結束時間 > 當前會議的開始時間,就表示重疊
if (intervals[i - 1][1] > intervals[i][0]) {
return false;
}
}
return true;
}
}時間複雜度 #
- 時間複雜度:O(n log n),其中 n 是會議的數量,主要時間花在排序上。
- 空間複雜度:O(1),只使用了常數額外空間。