返回
数据结构与算法——在 LeetCode 729 中学以致用
后端
2024-02-08 16:30:02
## LeetCode 729 题干
给定一个会议时间安排的数组 intervals,其中 intervals[i] = [starti, endi] 表示第 i 个会议的开始时间和结束时间。
请你判断一个人是否能够参加 **所有** 会议。
**示例 1:**
输入:intervals = [[0,30],[5,10],[15,20]]
输出:false
**示例 2:**
输入:intervals = [[7,10],[2,4]]
输出:true
## 解法一:排序 + 贪心
**1. 思路:**
- 将会议按开始时间排序。
- 依次检查每个会议,如果当前会议的开始时间小于或等于上一个会议的结束时间,则说明冲突,返回 false。
- 如果所有会议都能参加,则返回 true。
**2. 代码:**
```python
def canAttendMeetings(intervals):
"""
:type intervals: List[List[int]]
:rtype: bool
"""
# 将会议按开始时间排序
intervals.sort(key=lambda x: x[0])
# 依次检查每个会议
for i in range(1, len(intervals)):
if intervals[i][0] < intervals[i - 1][1]:
return False
return True
解法二:二分查找
1. 思路:
- 将会议按开始时间排序。
- 对于每个会议,使用二分查找找到上一个会议的结束时间。
- 如果当前会议的开始时间小于或等于上一个会议的结束时间,则说明冲突,返回 false。
- 如果所有会议都能参加,则返回 true。
2. 代码:
def canAttendMeetings(intervals):
"""
:type intervals: List[List[int]]
:rtype: bool
"""
# 将会议按开始时间排序
intervals.sort(key=lambda x: x[0])
# 对于每个会议,使用二分查找找到上一个会议的结束时间
for i in range(1, len(intervals)):
left, right = 0, i - 1
while left <= right:
mid = (left + right) // 2
if intervals[mid][1] <= intervals[i][0]:
left = mid + 1
else:
right = mid - 1
# 如果当前会议的开始时间小于或等于上一个会议的结束时间,则说明冲突
if intervals[i][0] < intervals[right][1]:
return False
return True
结语
通过解决 LeetCode 729 这道题,我们可以学到数据结构和算法在实际问题中的应用。希望本文对您有所帮助。
如果您想了解更多关于数据结构和算法的知识,欢迎访问 力扣 或其他在线学习平台。