leetcode
程序员文章站
2022-04-27 11:49:10
...
现在又入坑到LeetCode,easy的题目也得写个老半天才能AC。
写完之后,又忘记,所以决定还是记录一下吧,积累点经验呐!
题目描述
恩,题目就是这样,我当时是按数组做的,但是10^9这个,数组真存不了。
所以采用了vector<pair<int,int>>的数据结构,存这个区间开始和结束这两个节点的值,然后计算是否有重合。
重合的情况大概可以分为以下几类:
对于这几种情况,我分开来判断,
if((start>=p.first&&start<p.second)||(end>p.first&&end<=p.second)||(end>p.second&&start<p.first))
{
return false;
}
记得要考虑边界等号的情况,之前没考虑,找了好久的错误。
有一个更简便的高人方法,是一条判断语句,包含了四种情况,红线在蓝线的左边,就有重叠。否则,没有重叠。
max(s1,s2)<min(e1,e2)
我AC的代码为:
class MyCalendar {
public:
vector<pair<int, int>> calendar;
MyCalendar() {
}
bool book(int start, int end) {
bool flag=true;
for(pair<int, int> p : calendar)
{
if((start>=p.first&&start<p.second)||(end>p.first&&end<=p.second)||(end>p.second&&start<p.first))
{
return false;
}
}
calendar.push_back({start,end});
return flag;
}
};