LeetCode 715 Range模块[Map 线段树] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 715 Range模块[Map 线段树] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
一道非常细节的困难题,借用线段树的思想,定义map固定每个区间,key是右边界,value是左边界,在add中,最重要的步骤是合并重合的小区间为一个大区间,这就需要定义好l和r,不断寻找重合区间的最大右边界和最小左边界,并删除其中的小区间,最后将大区间放入map中,query函数实现起来更为简单,同样找右边界大于left的区间,判断区间是否全包围,没有返回false,全包围返回true。remove函数需要考虑三种情况,一种区间左边出了一点,一种区间右边出了一点,一种全在删除区间内,第一种情况需要新建一个区间在map中,以前的区间要和全删除区间一起删除,第二种直接更改区间即可,因为key没有变,代码如下:
class RangeModule
private:
map<int, int> mp;
public:
RangeModule()
void addRange(int left, int right)
int l = left, r = right;
// 找到刚好大于等于l的区间
auto p = mp.lower_bound(left);
// 合并重合区间
while(p != mp.end() && p->second <= right)
l = min(p->second, l);
r = max(p->first, r);
auto temp = p;
p ++;
mp.erase(temp->first);
mp[r] = l;
bool queryRange(int left, int right)
// 找到大于等于left的区间
auto temp = mp.lower_bound(left);
if(temp == mp.end()) return false;
if(temp->second <= left && temp->first >= right) return true;
return false;
void removeRange(int left, int right)
// 找到大于等于left的区间
auto p = mp.lower_bound(left + 1);
while(p != mp.end() && p->second <= right)
// 左边有可用区间
if(p->second < left)
mp[left] = p->second;
// 右边有可用区间
if(p->first > right)
mp[p->first] = right;
break;
else // 否则全部删除
auto temp = p;
p ++;
mp.erase(temp->first);
;
/**
* Your RangeModule object will be instantiated and called as such:
* RangeModule* obj = new RangeModule();
* obj->addRange(left,right);
* bool param_2 = obj->queryRange(left,right);
* obj->removeRange(left,right);
*/
以上是关于LeetCode 715 Range模块[Map 线段树] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章