leetcode 715. Range Module 解题报告

本文介绍了一种区间跟踪模块的设计与实现方法,该模块能够高效地添加、查询和移除区间范围。通过使用C++ map结构(基于红黑树实现),确保了操作的效率。文章详细展示了addRange、queryRange和removeRange三个核心方法的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
     */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值