LeetCode 715 Range模块[Map 线段树] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 715 Range模块[Map 线段树] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。


解题思路:
一道非常细节的困难题,借用线段树的思想,定义map固定每个区间,key是右边界,value是左边界,在add中,最重要的步骤是合并重合的小区间为一个大区间,这就需要定义好l和r,不断寻找重合区间的最大右边界和最小左边界,并删除其中的小区间,最后将大区间放入map中,query函数实现起来更为简单,同样找右边界大于left的区间,判断区间是否全包围,没有返回false,全包围返回true。remove函数需要考虑三种情况,一种区间左边出了一点,一种区间右边出了一点,一种全在删除区间内,第一种情况需要新建一个区间在map中,以前的区间要和全删除区间一起删除,第二种直接更改区间即可,因为key没有变,代码如下:

class RangeModule 
private:
    map<int, int> mp;
public:
    RangeModule() 

    
    
    void addRange(int left, int right) 
        int l = left, r = right;
        // 找到刚好大于等于l的区间
        auto p = mp.lower_bound(left);
        // 合并重合区间   
        while(p != mp.end() && p->second <= right) 
            l = min(p->second, l);
            r = max(p->first, r);
            auto temp = p;
            p ++;
            mp.erase(temp->first);
            
        
        mp[r] = l;
    
    
    bool queryRange(int left, int right) 
        // 找到大于等于left的区间
        auto temp = mp.lower_bound(left);
        if(temp == mp.end()) return false;
        if(temp->second <= left && temp->first >= right) return true;
        return false;
    
    
    void removeRange(int left, int right) 
        // 找到大于等于left的区间
        auto p = mp.lower_bound(left + 1); 
        while(p != mp.end() && p->second <= right) 
            // 左边有可用区间
            if(p->second < left) 
                mp[left] = p->second;
            
            // 右边有可用区间
            if(p->first > right) 
                mp[p->first] = right;
                break;
             else // 否则全部删除
                auto temp = p;
                p ++;
                mp.erase(temp->first);
            
             
    
;

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

以上是关于LeetCode 715 Range模块[Map 线段树] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] Range Module 范围模块

多处理计算中map()模块和imap()之间的差异

LeetCode Range Addition

LeetCode Range Sum Query - Mutable

LeetCode -- Range Sum Query

[LeetCode] 034. Search for a Range (Medium) (C++/Java)