[Google] LeetCode 729 My Calendar I
作者:互联网
You are implementing a program to use as your calendar. We can add a new event if adding the event will not cause a double booking.
A double booking happens when two events have some non-empty intersection (i.e., some moment is common to both events.).
The event can be represented as a pair of integers start and end that represents a booking on the half-open interval [start, end)
, the range of real numbers x
such that start <= x < end
.
Implement the MyCalendar
class:
MyCalendar()
Initializes the calendar object.boolean book(int start, int end)
Returns true if the event can be added to the calendar successfully without causing a double booking. Otherwise, return false and do not add the event to the calendar.
Solution
我们用 \(vector\) 套 \(pair\) 来维护时间坐标。那么如何查找当前的时间间隔是否与之前的有重叠呢
一种办法就是朴素的暴力 \(O(N)\), 不妨二分位置,如果在二分的过程中出现了重叠,那么直接 \(false\) 即可;否则在二分出的位置中插入当前的区间
点击查看代码
class MyCalendar {
private:
vector<pair<int,int>> t;
public:
MyCalendar() {
}
bool book(int start, int end) {
int n = t.size();
int l = 0, r = n-1;
int mid;
while(l<=r){
mid = l+(r-l)/2;
int curs = t[mid].first, cure = t[mid].second;
if(max(start, curs)<=min(end-1,cure))return false;
else if(start<curs) r=mid-1;
else l=mid+1;
}
t.insert(t.begin()+l, {start, end-1});
return true;
}
};
/**
* Your MyCalendar object will be instantiated and called as such:
* MyCalendar* obj = new MyCalendar();
* bool param_1 = obj->book(start,end);
*/
标签:Google,end,int,start,calendar,Calendar,My,event,MyCalendar 来源: https://www.cnblogs.com/xinyu04/p/16611600.html