c++线段树
Posted aaronwell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++线段树相关的知识,希望对你有一定的参考价值。
729. 我的日程安排表 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
函数最多不超过1000
次。 - 调用函数
MyCalendar.book(start, end)
时,start
和end
的取值范围为[0, 10^9]
。
解法1:
typedef struct tag_time_zone { int start; int end; tag_time_zone(int i1, int i2) { start = i1; end = i2; } } time_zone; class MyCalendar { public: vector<time_zone> vec1; bool book(int start, int end) { for (vector<time_zone>::iterator it1 = vec1.begin(); it1 != vec1.end(); ++it1) { if (start >= it1->start && start < it1->end) { return false; } else if (end > it1->start && end <= it1->end) { return false; } else if (start <= it1->start && end > it1->end) { return false; } } vec1.push_back(time_zone(start,end)); return true; } }; /** * Your MyCalendar object will be instantiated and called as such: * MyCalendar* obj = new MyCalendar(); * bool param_1 = obj->book(start,end); */ int main() { MyCalendar myCalendar; vector<vector<int>> shuchu = {{97,100},{33,51},{89,100},{83,100},{75,92},{76,95},{19,30},{53,63},{8,23},{18,37},{87,100},{83,100},{54,67},{35,48},{58,75},{70,89},{13,32},{44,63},{51,62},{2,15}}; for (int i = 0; i < shuchu.size(); ++i) { cout<<myCalendar.book(shuchu[i][0], shuchu[i][1]); // returns true } cout<<endl; for(auto c : myCalendar.vec1) { cout << c.start << " " << c.end <<endl; } return 0; }
解法2:
class MyCalendar { public: map<int, int> map1; bool book(int start, int end) { //for (map<int, int>::iterator it1 = map1.begin(); it1 != map1.end(); ++it1) { for (auto &c : map1) { if (start >= c.first && start < c.second) { return false; } else if (end > c.first && end <= c.second) { return false; } else if (start <= c.first && end > c.second) { return false; } } map1.insert(make_pair(start, end)); return true; } };
以上是关于c++线段树的主要内容,如果未能解决你的问题,请参考以下文章