[Leetcode] 715. Range Module 解题报告

Java实现 LeetCode 715 Range 模块(选范围) 715. Range 模块 Range 模块是跟踪数字范围的模块。你的任务是以一种有效的方式设计和实现以下接口。 addRange(int left, int right) 添加半开区间 [left, right),跟踪该区间中的每个实数。添加与当前跟踪的数字部分重叠的区间时,应当添加在区间 [left, right) 中尚未跟踪的任何数字到该区间中。 queryRange(int left, i... 阅读详情

题目:

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.

    思路:

    本题目可以用线段树来实现,但是这里我们用二分查找树来实现。我们定义一个map<int, int> invals,用来表示互不相交的线段,例如invales[left] = right就可以表示一个左闭右开的区间[left, right)。下面就看看各个函数分别怎么实现:
    1)addRange(int left, int right):首先找出[left, right)的前一个interval,然后判断我们是否需要在插入interval之前合并已有的interval,如果需要,则首先将待合并的interval删除,并更新left和right,最后将[left, right)插入二分查找树中。该函数的时间复杂度是O(nlogn)。

    2)queryRange(int left, int right):首先找出小于等于[left, right)的一个interval,然后判断它的右边是否覆盖掉了[left, right),如果是,则返回false,否则说明该interval覆盖掉了[left, right),所以返回true。该函数的时间复杂度仍然是O(nlogn)。

    3)removeRange(int left, int right):和addRange类似,我们首先找出和[left, right)重合的interval(s),然后将该区间内的interval(s)都移除掉。但是需要注意的是,如果左边有残余的interval或者右边有残余的interval,则需要分别将它们保留。该函数的时间复杂度仍然是O(nlogn)。

    整个算法的空间复杂度是O(n)。

    代码:

    class RangeModule {
    public:
        RangeModule() {
            
        }
        
        void addRange(int left, int right) {
            auto l = invals.upper_bound(left), r = invals.upper_bound(right); 
            if (l != invals.begin()) {      // find the iterator that is before the new segment
                l--;
                if (l->second < left) {
                    l++;
                }
            }
            if (l != r) {                   // if l != r, we should merge the intervals
                left = min(left, l->first);
                right = max(right, (--r)->second);
                invals.erase(l,++r);
            }
            invals[left] = right;
        }
        
        bool queryRange(int left, int right) {
            auto it = invals.upper_bound(left);
            if (it == invals.begin() || (--it)->second < right) {
                return false;
            }
            return true;
        }
        
        void removeRange(int left, int right) {
            auto l = invals.upper_bound(left), r = invals.upper_bound(right); 
            if (l != invals.begin()) {
                l--;
                if (l->second < left) {
                    l++;
                }
            }
            if (l == r) {                   // no interval to remove
                return;
            }
            int l1 = min(left, l->first), r1 = max(right, (--r)->second);
            invals.erase(l, ++r);
            if (l1 < left) {                // a smaller interval left in the left
                invals[l1] = left;
            }
            if (r1 > right) {               // a smaller interval left in the right
                invals[right] = r1;
            }
        }
    private:
        map<int, int> invals;
    };
    
    
    /**
     * 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模块 题目: Range 模块是跟踪数字范围的模块。你的任务是以一种有效的方式设计和实现以下接口。 addRange(int left, int right) 添加半开区间 [left, right),跟踪该区间中的每个实数。添加与当前跟踪的数字部分重叠的区间时,应当添加在区间[left, right) 中尚未跟踪的任何数字到该区间中。 queryRange(int left, int right) 只有在当前正在跟踪区间 [left, right) 中的每一个实数时,才返回 true。 removeRange(int left, int right) 停止跟踪区间 [left, right) 中 立即下载

相关推荐

告别手动打点!用Cesium为你的大疆无人机快速生成区域巡查航线(保姆级教程)

本文详细介绍了如何利用Cesium平台为大疆无人机快速生成区域巡查航线的保姆级教程。通过自动化航线规划,告别传统手动打点的繁琐操作,实现高效、无死角的区域覆盖。文章涵盖环境搭建、实战案例及高级优化技巧,特别适合无人机操作员和巡检工作者提升工作效率。

weixin_30399821的博客 518

【715. Range 模块】

来源:力扣(LeetCode)描述:Range模块是跟踪数字范围的模块。设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们。半开区间 表示所有 的实数 。实现 RangeModule 类:示例 1: 提示:方法 :有序集合 / 有序映射思路与算法 代码:...

Sugar_wolf的博客 245

蓝牙钥匙 第48次 全面解析防中继攻击保护:从原理到防护技术实践

中继攻击已成为物联网安全领域的重要威胁,2023年全球相关损失达数十亿美元。本文深入分析中继攻击原理,揭示其通过转发设备延长通信距离而不破解加密的特点。重点探讨两种关键防护技术:基于距离测量的方法(包括UWB超宽带技术)可精确检测异常距离;基于时间戳的挑战-响应机制则通过严格时间窗口识别中继延迟。文章还提出多层次防护体系构想,结合AI异常检测和量子安全协议等前沿技术。研究显示,集成多种防护技术并遵循行业标准是应对中继攻击的有效途径,为物联网设备安全提供重要参考。

IT深耕十余载,大道之简 1821

leetcode:715. Range 模块

1) 插入操作就是57. insert interval这道题。

OceanStar的博客 275

用Quartus II和LPM_ROM手把手复现西电计组课设:从微指令到五条指令的完整流程

本文详细介绍了使用Quartus II和LPM_ROM复现西电计组课设的完整流程,从微指令编写到五条指令的实现。通过环境搭建、LPM_ROM配置、微程序设计及调试技巧,帮助读者高效完成课程设计,避开常见问题。适合计组课程设计的学习者和实践者参考。

weixin_29288313的博客 456

Chronos时间序列预测实战:从零开始微调你的第一个大语言模型(附完整代码)

本文提供了一份详细的Chronos时间序列预测大语言模型微调实战指南。从环境搭建、数据预处理到模型配置与训练,手把手教你如何利用自己的数据微调Chronos模型,并完成评估与部署,助你快速掌握这一前沿技术。

zzz56的博客 300

【Leetcode】715. Range Module

题目地址: https://leetcode.com/problems/range-module/ 要求设计一个数据结构,可以做如下操作: 1、跟踪一个区间[l,r)[l,r)[l,r)里的数; 2、放弃跟踪一个区间[l,r)[l,r)[l,r)里的数; 3、查询区间[l,r)[l,r)[l,r),返回是否这个区间里的所有的数都被跟踪了。 同一个数被跟踪多次和跟踪一次是等效的。 法1:线段树。这一题是经典的带懒标记的线段树的应用。我们思考懒标记应当如何打。假设递归到了当前节点,如果当前节点所维护的区间被完全

数学、算法爱好者的博客 576

django drf 框架知识点(一)——serializer序列化器_用法全解

【django drf】序列化器:别名设置,全部参数序列化,自定义字段,只读只写,部分更新

qq_59344127的博客 1338

LeetCode刷题——715. Range 模块

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

艾醒的博客 319

MCP+A2A:从实验室到生产环境的落地之旅

本文通过实际项目中的落地案例,展示了 MCP+A2A 协议结合使用的强大功能和广泛适用性。同时,我们也探讨了开发者社区的贡献、与其他技术的融合,以及未来技术趋势的展望。希望本文能够帮助读者更好地理解如何将这一架构从实验室推向生产环境,推动 AI 技术的实际应用。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1492

VTK在QT与非QT环境下使用的区别

VTK可以在QT框架内使用,也可以独立于QT使用,这两种使用方式在架构、交互和渲染方面有显著差异。

深之JohnChen的专栏 628

LeetCode 715. Range 模块

715. Range 模块 【有序区间】区间拆分与合并,需要注意add的时候如果遇到[1, 10), [10, 11]这种要把他们合并起来,因为有可能查询[1, 11]这样的区间,因此这里用floorKey来找。

Sasakihaise_的博客 2593

提交 ieee 手稿出现:Do not include the Reviewer PDF with my submission 怎么办

IEEE投稿Reviewer PDF选项说明 投稿时出现的"Do not include the Reviewer PDF with my submission"选项控制是否附带评审专用PDF文件。Reviewer PDF是系统自动生成包含所有投稿材料的完整PDF,用于同行评审。建议保持默认不勾选状态,除非确认编辑部不需要该文件,否则可能影响审稿流程。勾选表示不附带此PDF,不勾选则会正常生成并提交该评审文件。

ZhangJiqun&191cm&85kg 2170

leetcode 715. Range Module 解题报告

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

Fortune favors the dream of attention. 21万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

leetcode 715. Range Module

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 int...

cmy203的博客 210

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

leetcode 困难题 715. Range Module Range 模块-内存100%

struct node { int left; int right; bool operator <(const node& a) const { return left < a.left; } };

邹九的个人博客 237

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

掌握线段树:从基础原理到LeetCode实战指南

线段树是一种高效的区间查询与更新数据结构,在处理数组区间问题时展现出卓越性能。本文将通过LeetCode实战案例,带你系统掌握线段树的核心原理与应用技巧,让你轻松应对各类区间操作难题。 ## 线段树核心概念解析 线段树(Segment Tree)是一种基于分治思想的二叉树结构,它将一个区间划分成若干个子区间,每个节点代表一个子区间。这种结构特别适合处理**区间查询**和**单点/区间更新**操

gitblog_00080的博客 487

715. Range Module

715. Range Module 题目描述: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)

OovEver的专栏 1081

【LeetCode715.Range模块】

本文主要解释了力扣715.Range模块。

qq_52114254的博客 312

【线段树 有序映射】715. Range 模块

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

闻缺陷则喜何志丹 1132

LeetCode每日一题(715. Range Module)

这一点开始被我忽略了, 后来测试总是通不过, 费了半天劲才发现是这里的问题。remove_range 时基本与 add_range 相同, 但是要注意一点, 更新当前节点 is_tracked 的时候不用考虑子节点的 is_tracked, 只要参数范围与当前节点的范围有交集, 那当前节点的 is_tracked 就一定是 false, 因为有任何一个子节点是 untracked 的, 那当前节点就是 untracked 的, 题目里对此有交代。

wangjun861205的博客 445

【LeetCode:715. Range 模块 | 线段树】

【LeetCode:715. Range 模块 | 线段树】Range模块是跟踪数字范围的模块。设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们。 半开区间 [left, right) 表示所有 left

Coder_ljw的博客 330

LeetCode解析------715.Range模块

题目: Range 模块是跟踪数字范围的模块。你的任务是以一种有效的方式设计和实现以下接口。 addRange(int left, int right) 添加半开区间 [left, right),跟踪该区间中的每个实数。添加与当前跟踪的数字部分重叠的区间时,应当添加在区间[left, right) 中尚未跟踪的任何数字到该区间中。 queryRange(int left, int right) ...

weixin_44337475的博客 355

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

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

HERODING23的博客 273

C#参数详解五(参数数组)

参数数组 前面所述的参数类型都必须严格地一个实参对应一个形参。参数数组则不同,它允许零个或多个实参对应一个特殊的形参。 参数数组的重点如下: 在一个参数列表中只能有一个参数数组。 如果有,它必须是列表中的最后一个。 由参数数组表示的所有参数都必须具有相同的类型。 声明一个参数数组必须做的事如下: 在数据类型前使用 params修饰符。 在数据类型后放置一组空的方括号。 下面的方法头展示了int型参数数组的声明语法。在这个示例中,形参 invasi可以代表零个或多个int实参。 void ListIn

weixin_46433786的博客 3048

LeetCode 715. Range Module / 57. Insert Interval(区间查询更新,离散化)

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 interva...

qq_26973089的博客 508
上一篇: [Leetcode] 714. Best Time to Buy and Sell Stock with Transaction Fee 解题报告
下一篇: [Leetcode] 716. Max Stack 解题报告
魔豆Magicbean
博客等级 码龄19年 146粉丝 742原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值