首页 > 其他分享 >[LeetCode] 715. Range 模块

[LeetCode] 715. Range 模块

时间:2023-11-12 21:03:44浏览次数:27  
标签:right int auto 715 Range ans INF LeetCode left

题目

Range模块是跟踪数字范围的模块。设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们。

半开区间 [left, right) 表示所有 left <= x < right 的实数 x 。

实现 RangeModule 类:

RangeModule() 初始化数据结构的对象。 void addRange(int left, int right) 添加 半开区间 [left, right),跟踪该区间中的每个实数。添加与当前跟踪的数字部分重叠的区间时,应当添加在区间 [left, right) 中尚未跟踪的任何数字到该区间中。 boolean queryRange(int left, int right) 只有在当前正在跟踪区间 [left, right) 中的每一个实数时,才返回 true ,否则返回 false 。 void removeRange(int left, int right) 停止跟踪 半开区间 [left, right) 中当前正在跟踪的每个实数。

代码

typedef pair<int, int> PII;

const int INF = 2e9;

#define x first
#define y second

class RangeModule {
public:
    set<PII> S;
    RangeModule() {
            S.insert({-INF, -INF});
            S.insert({INF, INF});
    }
    
    void addRange(int left, int right) {
        auto i = S.lower_bound({left, -INF});
        i--;
        if(i->y < left) i++;
        if(i->x > right){
            S.insert({left, right});
        }
        else{//有交集
            auto j = i;
            while(j->x <= right) j++;
            j--;
            PII t(min(i->x, left), max(j->y, right));
            while(i!=j){
                auto k=i;
                k++;
                S.erase(i);
                i=k;
            }
            S.erase(i);
            S.insert(t);
        }
    }
    
    bool queryRange(int left, int right) {
        auto i = S.upper_bound({left, INF});
        i--;
        return i->y >= right;
    }

    vector<PII> get(PII a, PII b){
        vector<PII> ans;
        if(a.x < b.x){
            if(a.y > b.y){
                ans.push_back({a.x, b.x});
                ans.push_back({b.y, a.y});
            }else{
                ans.push_back({a.x, b.x});
            }
        }else{
            if(a.y > b.y)   ans.push_back({b.y, a.y});
        }
        return ans;
    }
    
    void removeRange(int left, int right) {
        auto i = S.lower_bound({left, -INF});
        i--;
        if(i->y < left) i++;
        if(i->x <= right)
        {
            auto j = i;
            while(j->x <= right) j++;
            j--;
            auto a = get(*i, {left, right});
            auto b = get(*j, {left, right});
            while(i!=j){
                auto k=i;
                k++;
                S.erase(i);
                i=k;
            }
            S.erase(i);
            for(auto t: a)  S.insert(t);
            for(auto t: b)  S.insert(t);
        }
    }
};

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

标签:right,int,auto,715,Range,ans,INF,LeetCode,left
From: https://blog.51cto.com/u_15567308/8330845

相关文章

  • CF1322E - Median Mountain Range - 总结
    CF1322E-MedianMountainRange考虑分别对每个位置求出最后的数字。先枚举出这个数\(x\),并将\(a_i\gex\)的数设为\(1\),\(a_i<x\)的数设为\(0\),然后做题目中的操作,若为\(0\),则最终结果小于\(x\),为\(1\)则大于等于\(x\)。使用二分可以优化到\(\Omicron(n^2\log......
  • leetcode hot100-02 字母异位词分组
    题目:字母异位词分组难度:中等地址:https://leetcode.cn/classic/problems/group-anagrams/description/描述:给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。字母异位词 是由重新排列源单词的所有字母得到的一个新单词。过程:1、首先啥叫......
  • leetcode hot 100-01 两数之和
    题目:两数之和难度:简单题目地址:https://leetcode.cn/classic/problems/two-sum/description/过程一,因为难度是简单,就没有仔细审题,以为返回两个数就好,使用双指针,逻辑如下:对数组排序双指针分别指向头和尾两数之和大于target,尾部指针-1两数之......
  • Leetcode133.克隆图
     需要注意图中存在环路。JAVA:publicfinalNodecloneGraph(Nodenode){returndeepCopy(node,newHashMap<Integer,Node>());}privateNodedeepCopy(Nodenode,HashMap<Integer,Node>hisMap){if(null==node)return......
  • #yyds干货盘点# LeetCode程序员面试金典:累加数
    题目累加数是一个字符串,组成它的数字可以形成累加序列。一个有效的累加序列必须至少包含3个数。除了最开始的两个数以外,序列中的每个后续数字必须是它之前两个数字之和。给你一个只包含数字'0'-'9'的字符串,编写一个算法来判断给定输入是否是累加数。如果是,返回true......
  • #yyds干货盘点# LeetCode程序员面试金典:供暖器
    题目冬季已经来临。你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。在加热器的加热半径范围内的每个房屋都可以获得供暖。现在,给出位于一条水平线上的房屋houses和供暖器heaters的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。注意:所有供暖器heaters......
  • for循环,range函数,无线while循环
    #for循环中,含有for遍历;其语法结构是:for+变量(设置一个变量)+in+遍历对象#range函数,是Python中的一个内置函数,产生一个{n,m)的整数序列,其中包含n,不包含m#在使用for遍历时将变量用range函数来代替,那么这时for循环将遍历range中的序列中的元素。foriinrange(1,11):......
  • LeetCode-88题合并两个有序数组
    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应......
  • LeetCode #1131 Maximum of Absolute Value Expression 绝对值表达式的最大值
    安装Flutter环境首先配置flutter3开发环境,照着官方教程傻瓜式安装即可。>>安装和环境配置|Flutter中文文档|Flutter中文开发者网站注意在国内网络环境下需要进行一些额外的环境配置:>>在中国网络环境下使用Flutter|Flutter中文文档|Flutter中文开发者网站Description......
  • LeetCode_0042. 接雨水
    题目描述给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示雨......