返回

数据结构与算法——在 LeetCode 729 中学以致用

后端





## 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 这道题,我们可以学到数据结构和算法在实际问题中的应用。希望本文对您有所帮助。

如果您想了解更多关于数据结构和算法的知识,欢迎访问 力扣 或其他在线学习平台。