leetcode 715. Range Module 解题报告

来源:互联网 发布:天津淘宝商会会长 编辑:程序博客网 时间:2024/06/05 13:12

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): nullremoveRange(14, 16): nullqueryRange(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); */


  • 原创粉丝点击