您的位置:首页 > 其它

leetcode 715. Range Module 解题报告

2017-12-19 19:08 351 查看
A Range Module is a module that tracks ranges of numbers. Your task is to design and implement the following interfaces in an efficient manner.

addRange(int left, int right)
 Adds the half-open interval 
[left,
right)
, tracking every real number in that interval. Adding an interval that partially overlaps with currently tracked numbers should add any numbers in the interval 
[left,
right)
 that are not already tracked.

queryRange(int left, int right)
 Returns true if and only if every real number in the interval 
[left,
right)
 is currently being tracked.

removeRange(int left, int right)
 Stops tracking every real number currently being tracked
in the interval 
[left, right)
.

Example 1:

addRange(10, 20): null
removeRange(14, 16): null
queryRange(10, 14): true (Every number in [10, 14) is being tracked)
queryRange(13, 15): false (Numbers like 14, 14.03, 14.17 in [13, 15) are not being tracked)
queryRange(16, 17): true (The number 16 in [16, 17) is still being tracked, despite the remove operation)


Note:

A half open interval 
[left, right)
 denotes all real numbers 
left
<= x < right
.
0 < left < right < 10^9
 in all calls to 
addRange,
queryRange, removeRange
.
The total number of calls to 
addRange
 in a single test case is at most 
1000
.
The total number of calls to 
queryRange
 in a single test case is at most 
5000
.

The total number of calls to 
removeRange
 in a single test case is at most 
1000
.
A Range Module is a module that tracks ranges of numbers. Your task is to design and implement the following interfaces in an efficient manner.

主要用到了c++ map结构,map底层使用红黑树实现

class RangeModule {
public:
map<int,int> hm;
RangeModule() {
}
void addRange(int left, int right) {
if(left>right) return;
std::map<int,int>::iterator iter1,iter2;
iter1=hm.lower_bound(left);
iter2=hm.lower_bound(right);
if(iter1 == hm.end() && iter2==hm.end()){
hm[right]=left;
}else if(iter2!=hm.end() && hm[iter2->first]<=right ){
int m = min(left,iter2->second);
if(iter1 != hm.end() ) m = min(m,iter1->second);
hm[iter2->first] = m;
}else{
int m = left;
if(iter1 != hm.end()) m = min(m,iter1->second);
hm[right]= m;
}
iter1=hm.lower_bound(left);
iter2 = hm.lower_bound(right);
hm.erase(iter1,iter2);
}
bool queryRange(int left, int right) {
std::map<int,int>::iterator iter;
iter=hm.lower_bound(right);
if(iter==hm.end()){
return false;
}
if(iter->second<=left)
return true;
else
return false;
}
void removeRange(int left, int right) {
if(left>right) return;
std::map<int,int>::iterator iter1,iter2;
iter1=hm.lower_bound(left);
iter2=hm.lower_bound(right);
if(iter1!=hm.end() && iter1->second <left ){
hm[left]=iter1->second ;
}
if(iter2!=hm.end() && iter2->second<right){
hm[iter2->first]=right;
}
iter1=hm.upper_bound(left);
iter2=hm.upper_bound(right);
hm.erase(iter1,iter2);
}
};

/**
* 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);
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: