LeetCode 715. Range Module
方法1.vector
class RangeModule {
private:
vector<pair<int,int>> ranges;
public:
RangeModule() {}
void addRange(int left,int right){
vector<pair<int,int>>new_ranges;
bool inserted=false;
for(auto kv:ranges){
if(kv.first>right && !inserted){
new_ranges.emplace_back(left,right);//new_ranges.emplace_back(left,right);
inserted=true;
}
if(kv.first>right || kv.second<left){ //无overlap
new_ranges.push_back(kv);
}else{
left=min(left,kv.first);
right=max(right,kv.second);
}
}
if(!inserted) new_ranges.emplace_back(left,right);
ranges.swap(new_ranges);
}
bool queryRange(int left,int right){
const int n=ranges.size();
int l=0;
int r=n-1;
while(l<=r){
int m=l+(r-l)/2;
if(ranges[m].second<left) {l=m+1;}
else if(ranges[m].first>right){r=m-1;}
else{ ///m和[left,right]有overlap
return ranges[m].first<=left&&ranges[m].second>=right; ///是否真子集
}
}
return false;
}
void removeRange(int left,int right){
vector<pair<int,int>> new_ranges;
for(auto kv:ranges){
if(kv.first>right || kv.second<left){
new_ranges.push_back(kv);
}else{
if(kv.first<left) new_ranges.emplace_back(kv.first,left);
if(kv.second>right) new_ranges.emplace_back(right,kv.second);
}
}
ranges.swap(new_ranges);
}
};
/**
* 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);
*/
方法2..Map (BST)
class RangeModule {
private:
typedef map<int,int>::iterator IT;
map<int,int> ranges;
void getOverlapRanges(int left,int right,IT& l,IT& r){
l=ranges.upper_bound(left);
r=ranges.upper_bound(right);
if(l!=ranges.begin()){
if((--l)->second<left) l++; //当前的[left,right]区间和--l的区间不交
}
}
public:
RangeModule() {
}
void addRange(int left,int right){
IT l,r;
getOverlapRanges(left,right,l,r);
if(l!=r){
auto last=r;last--;
left=min(left,l->first);
right=max(right,last->second);
ranges.erase(l,r);
}
ranges[left]=right;
}
bool queryRange(int left,int right){
IT l,r;
getOverlapRanges(left,right,l,r);
if(l==r){ //此区间不存在
return false;
}
return l->first<=left&&l->second>=right; //真子集
}
void removeRange(int left,int right){
IT l,r;
getOverlapRanges(left,right,l,r);
if(l==r) return ;
auto last=r;last--;
int start=min(left,l->first);
int End=max(right,last->second);
ranges.erase(l,r);
if(start<left) ranges[start]=left;
if(End>right) ranges[right]=End;
}
};
/**
* 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);
*/