系列文章目录
【拒绝算法PUA】0x00-位运算
【拒绝算法PUA】0x01- 区间比较技巧
【拒绝算法PUA】0x02- 区间合并技巧
【拒绝算法PUA】0x03 - LeetCode 排序类型刷题
【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中
C++刷题技巧总结:
[温习C/C++]0x04 刷题基础编码技巧
LeetCode 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;
}