【拒绝算法PUA】 729. 我的日程安排表 I

系列文章目录

【拒绝算法PUA】0x00-位运算
【拒绝算法PUA】0x01- 区间比较技巧
【拒绝算法PUA】0x02- 区间合并技巧
【拒绝算法PUA】0x03 - LeetCode 排序类型刷题
【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中

C++刷题技巧总结:
[温习C/C++]0x04 刷题基础编码技巧



LeetCode 729. 我的日程安排表 I

链接

729. 我的日程安排表 I

题目

实现一个 MyCalendar 类来存放你的日程安排。如果要添加的日程安排不会造成 重复预订 ,则可以存储这个新的日程安排。

当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生 重复预订 。

日程可以用一对整数 startTime 和 endTime 表示,这里的时间是半开区间,即 [startTime, endTime), 实数 x 的范围为,  startTime <= x < endTime 。

实现 MyCalendar 类:

MyCalendar() 初始化日历对象。
boolean book(int startTime, int endTime) 如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true 。否则,返回 false 并且不要将该日程安排添加到日历中。
 

示例:

输入:
["MyCalendar", "book", "book", "book"]
[[], [10, 20], [15, 25], [20, 30]]
输出:
[null, true, false, true]

解释:
MyCalendar myCalendar = new MyCalendar();
myCalendar.book(10, 20); // return True
myCalendar.book(15, 25); // return False ,这个日程安排不能添加到日历中,因为时间 15 已经被另一个日程安排预订了。
myCalendar.book(20, 30); // return True ,这个日程安排可以添加到日历中,因为第一个日程安排预订的每个时间都小于 20 ,且不包含时间 20 。
 

提示:

0 <= start < end <= 109
每个测试用例,调用 book 方法的次数最多不超过 1000 次。

分析

在这里插入图片描述

解题方法1

#include <iostream>
#include <vector>

using namespace std;

class MyCalendar {
public:
    MyCalendar() {
        db = vector<vector<int>>();
    }

    bool check(int start2, int end2) {
        bool flag = false; // 默认没有重合
        for (auto data : db) {
            int start1 = data[0];
            int end1 = data[1];
            bool cmp1 = end1 <= start2; // 不交叉:场景1
            bool cmp2 = end2 <= start1; // 不交叉:场景2
            if (!cmp1 && !cmp2) {
                flag = true; // true表示有重合
                break;
            }
        }
        return flag;
    }

    bool book(int startTime, int endTime) {
        if (db.empty()) {
            db.push_back(vector<int> {startTime, endTime});
            return true;
        }

        bool res = true; // 默认无重合,可以添加
        if (check(startTime, endTime)) {
            res = false; // 更新状态的有重合,此时不添加数据到db
        }

        if (res) {
            db.push_back(vector<int> {startTime, endTime});
        }
        return res;
    }

private:
    vector<vector<int>> db;
};

在这里插入图片描述

解题方法2(优化版本)

#include <iostream>
#include <vector>
using namespace std;
class MyCalendar {
public:
    MyCalendar() {
    }
    bool book(int startTime, int endTime) {
        for (const auto& data : db) {
            int start1 = data.first;
            int end1 = data.second;
            if (max(start1, startTime) < min(end1, endTime)) {
                return false;
            }
        }
        db.emplace_back(startTime, endTime);
        return true;
    }

private:
    vector<pair<int, int>> db;
};

int main(int argc, char **argv) {
    MyCalendar* obj = new MyCalendar();
    // [10, 20], [15, 25], [20, 30]
    bool param_1 = obj->book(10,20);  // true
    bool param_2 = obj->book(15, 25); // false
    bool param_3 = obj->book(20, 30); // true
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值