我的日程安排表 I

问题描述:

实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排,则可以存储这个新的日程安排。
MyCalendar 有一个 book(int start, int end)方法。它意味着在 start 到 end 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为,  start <= x < end。
当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生重复预订。
每次调用 MyCalendar.book方法时,如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true。否则,返回 false 并且不要将该日程安排添加到日历中。
请按照以下步骤调用 MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)

示例 1
MyCalendar();
MyCalendar.book(10, 20); // returns true
MyCalendar.book(15, 25); // returns false
MyCalendar.book(20, 30); // returns true
解释:
第一个日程安排可以添加到日历中. 第二个日程安排不能添加到日历中,因为时间 15 已经被第一个日程安排预定了。
第三个日程安排可以添加到日历中,因为第一个日程安排并不包含时间 20 。

说明:
每个测试用例,调用 MyCalendar.book 函数最多不超过 100次。
调用函数 MyCalendar.book(start, end)时, start 和 end 的取值范围为 [0, 10^9]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/my-calendar-i

思路:

不能加入日程的情况有3种:
1、开始时间不合适,在某个日程的开始和结束日程的中间
2、结束时间不合适,在某个日程的开始和结束日程的中间
3、开始时间和结束时间涵盖某个日程
用一个二维vector来存储所有的日程,其中每行表示一个日程,每行的第一个元素表示每个日程的开始时间,每行的第二个元素表示每个日程的结束时间。
在一个新的日程到来之时,遍历所有已存在的日程,如果有冲突,返回false;否则将新日程插入到日程表中,并返回true。
需要注意,在判断冲突的时候,是大于还是大于等于,是小于还是小于等于。

题解:

class MyCalendar {
public:
    vector<int> tmp;
    vector<vector<int>> vec;

    MyCalendar() {

    }

    bool book(int start, int end) {
        int n = vec.size();
        for (int i = 0; i < n; i++) {
            if ((start >= vec[i][0] && start < vec[i][1]) || (vec[i][0] < end && vec[i][1] >= end) ||
                (start <= vec[i][0] && end >= vec[i][1])) {
                return false;
            }
        }
        tmp.push_back(start);
        tmp.push_back(end);
        vec.push_back(tmp);
        tmp.clear();
        return true;
    }
};

标签: none

添加新评论