Given an array of meeting time intervals
where intervals[i] = [startᵢ, endᵢ]
, determine if a person could attend all meetings.
給定一個會議時間 intervals
陣列,其中 intervals[i] = [startᵢ, endᵢ]
,判斷一個人是否能夠參加所有會議。
Example 1:
Input:
intervals = [[0,30],[5,10],[15,20]]
Output:
false
Example 2:
Input:
intervals = [[7,10],[2,4]]
Output:
true
Constraints:
0 <= intervals.length <= 10⁴
intervals[i].length == 2
0 <= startᵢ < endᵢ <= 10⁶
解題思路
要判斷一個人是否能夠參加所有會議,關鍵在於檢查會議時間是否有重疊。若有任何兩個會議的時間區間重疊,則無法參加所有會議。
重疊情況分析
以 [1,5]
和 [2,4]
為範例:
- 假設會議時間按開始時間排序:將所有會議按照開始時間由早到晚排列
- 檢查相鄰會議:排序後,只需檢查相鄰的會議是否重疊
- 重疊條件:前一個會議的結束時間 > 下一個會議的開始時間
步驟
- 將所有會議按開始時間排序
- 遍歷排序後的會議陣列
- 檢查每個會議的結束時間是否晚於下一個會議的開始時間
- 若發現重疊,回傳
false
;否則回傳 true
這樣的方法時間複雜度為 O(n log n)(主要是排序的時間),空間複雜度為 O(1)。
範例程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| var canAttendMeetings = function (intervals) { intervals.sort((a, b) => a[0] - b[0]); const lastMeetingEnd = intervals[0][1]; for (let i = 1; i < intervals.length; i++) { if(intervals[i][0] < lastMeetingEnd) { return false; } lastMeetingEnd = intervals[i][1]; }
return true; }
|
前端應用場景
這類問題在前端應用中極為常見,特別是涉及時間管理的系統:
1. 日曆與排程系統
- 會議排程:檢查新會議是否與現有會議時間衝突
- 預訂系統:確保時間段不重疊,避免雙重預訂
- 資源管理:防止同一資源在同一時間被多次分配
- 營業時間設定:驗證多個營業時段是否重疊
- 配送時間管理:確保配送時間區間邏輯正確
- 客戶端驗證:在提交前即時檢測衝突,提升用戶體驗
React 互動範例
以下範例模擬會議室預訂系統,展示如何使用本題演算法檢查新會議是否與已預訂時段衝突:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| import React, { useState, useMemo } from "react";
type Interval = { start: number; end: number };
export default function MeetingChecker() { const existingMeetings: Interval[] = [ { start: 9, end: 11 }, { start: 14, end: 16 }, ];
const [newMeeting, setNewMeeting] = useState({ start: 10, end: 12 });
const hasConflict = useMemo(() => { const all = [...existingMeetings, newMeeting]; const sorted = all.sort((a, b) => a.start - b.start);
for (let i = 1; i < sorted.length; i++) { if (sorted[i].start < sorted[i - 1].end) return true; } return false; }, [newMeeting]);
return ( <div className="p-6 max-w-md mx-auto"> <h2 className="text-lg font-bold mb-3">會議室預訂系統</h2>
{/* 已預訂會議 */} <div className="mb-4 text-sm text-gray-600"> <div>已預訂:09:00-11:00</div> <div>已預訂:14:00-16:00</div> </div>
{/* 新增會議 */} <div className="flex gap-2 items-center mb-3"> <span>新增會議:</span> <input type="number" value={newMeeting.start} onChange={(e) => setNewMeeting({ ...newMeeting, start: +e.target.value })} className="border p-1 rounded w-16" /> <span>~</span> <input type="number" value={newMeeting.end} onChange={(e) => setNewMeeting({ ...newMeeting, end: +e.target.value })} className="border p-1 rounded w-16" /> </div>
{/* 結果顯示 */} <div className={`p-2 rounded text-sm ${ hasConflict ? "bg-red-100 text-red-700" : "bg-green-100 text-green-700" }`}> {hasConflict ? "❌ 時間衝突,無法預訂" : "✅ 可以預訂"} </div> </div> ); }
|
使用情境:模擬會議室預訂系統,當用戶嘗試新增會議時,即時檢查是否與已預訂時段衝突。試著調整時間(例如改為 12-13
)觀察結果變化。