LeetCode_715. Range Module

 

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);
 */
发布了88 篇原创文章 · 获赞 77 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43107805/article/details/105170280