题目:

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.

分析:

维护一个区间集合,支持增加和删除区间的操作,当queryRange也就是查询某个区间是否存在时,如果是已有区间包含查询的区间就返回true。

使用一个List用来存储所有的区间,在add方法中保持List中的区间有序。每一次add新区间时,都遍历原来的List,找到待添加区间应插入的位置。

如果原来的区间和插入区间有重叠,就将它们合并。

查询区间可以通过二分法来查找。

程序:

class RangeModule {

    public RangeModule() {
range = new LinkedList<>();
} public void addRange(int left, int right) {
List<int[]> tempList = new LinkedList<>();
boolean insert = false;
for(int[] r:range){
if(right < r[0] && !insert){
tempList.add(new int[]{left, right});
insert = true;
}
if(r[0] > right ||r[1] < left)
tempList.add(r);
else{
left = Math.min(left, r[0]);
right = Math.max(right, r[1]);
}
}
if(!insert)
tempList.add(new int[]{left, right});
range = tempList;
} public boolean queryRange(int left, int right) {
int l = 0;
int r = range.size()-1;
while(l <= r){
int mid = l + (r - l) / 2;
int[] p = range.get(mid);
if(right < p[0]){
r = mid - 1;
}else if(p[1] < left){
l = mid + 1;
}else{
return p[0] <= left && p[1] >= right;
}
}
return false;
} public void removeRange(int left, int right) {
List<int[]> tempList = new LinkedList<>();
for(int[] r:range){
if(r[0] > right || r[1] < left)
tempList.add(r);
else{
if(r[0] < left)
tempList.add(new int[]{r[0], left});
if(r[1] > right)
tempList.add(new int[]{right, r[1]});
}
}
range = tempList;
}
private List<int[]> range;
} /**
* Your RangeModule object will be instantiated and called as such:
* RangeModule obj = new RangeModule();
* obj.addRange(left,right);
* boolean param_2 = obj.queryRange(left,right);
* obj.removeRange(left,right);
*/

LeetCode 715. Range Module Range 模块 (Java)的更多相关文章

  1. [LeetCode] Range Module 范围模块

    A Range Module is a module that tracks ranges of numbers. Your task is to design and implement the f ...

  2. [Swift]LeetCode715. Range 模块 | Range Module

    A Range Module is a module that tracks ranges of numbers. Your task is to design and implement the f ...

  3. 715. Range Module

    A Range Module is a module that tracks ranges of numbers. Your task is to design and implement the f ...

  4. Range Module

    2019-09-21 18:54:16 715. Range Module 问题描述: 问题求解: 用线段树解决了. class RangeModule { Node root; class Node ...

  5. 【设计模式】module(模块)模式

    写在前面 最近刚接触到设计模式, <head first设计模式>里有一篇文章,是说使用模式的心智, 1.初学者"心智" :"我要为HELLO WORLD找个 ...

  6. IDEA报错Error:Module 'shop-common' production: java.lang.IndexOutOfBoundsException

    问题描述: 本来项目是正常的,编译.运行.启动都是OK的,但是在一次电脑重启后,出现了以上这个问题:Error:Module 'shop-common' production: java.lang.I ...

  7. 安卓与Unity交互之-Android Studio创建Module库模块教程

    安卓开发工具创建Module库 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  8. AngularJS系统学习之Module(模块)

    本文源自:http://blog.csdn.net/woxueliuyun/article/details/50962645 学习之后略有所得, 来此分享.建议看原文. 模块是提供一些特殊服务的功能块 ...

  9. Java实现 LeetCode 715 Range 模块(选范围)

    715. Range 模块 Range 模块是跟踪数字范围的模块.你的任务是以一种有效的方式设计和实现以下接口. addRange(int left, int right) 添加半开区间 [left, ...

  10. LeetCode算法题-Range Addition II(Java实现)

    这是悦乐书的第271次更新,第285篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第138题(顺位题号是598).给定一个m行n列的新二维数组M,其初始值为0.提供一个二 ...

随机推荐

  1. 力扣41(java)-缺失的第一个正数(困难)

    题目: 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数. 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案. 示例 1: 输入:nums = [1,2,0 ...

  2. 跨全端SDK技术演进

    简介: 细想,团队进行跨平台开发已有三年有余,也是集团里面C++方向里比较早涉及该领域的部门之一,伴随业界跨平台技术发展与演进,我们也沉淀了一整套基于C++的跨平台技术体系,本文将以消息SDK为例,详 ...

  3. 配置审计(Config)变配报警设置

    简介: 本文作者[紫极zj],本篇将主要介绍通过配置审计的自定义规则等服务,对负载均衡进行预警行为的相关介绍. 前言 配置审计(Config)将您分散在各地域的资源整合为全局资源列表,可便捷地搜索全局 ...

  4. 什么是 IDA 工具

    中文名:交互式反编译器 英文名:Interactive Disassembler Professional 为众多 0day 世界的成员和 ShellCode 安全分析人士不可缺少的利器! IDA P ...

  5. JavaScript之变量解构赋值的使用

    引言 解构赋值是ES6中引入的一种能快速方便的进行变量赋值的方法,其主要也就是分为解构和赋值两部分内容.解构者,也就是匹配结构,然后分解结构进行赋值. 数组的解构赋值 使用 const arr = [ ...

  6. frp内网穿透器安装与介绍

    1.NAT访问 2.FRP介绍 中文官方文档:https://gofrp.org/docs/ github:https://github.com/fatedier/frp/releases frp 采 ...

  7. DE10-Lite锁相环使用教程

    DE10-Lite锁相环使用教程 目标:本文讲述如何在Quartus里设置和例化一个锁相环. 引言 锁相环(PLL)是一种闭环频率控制电路,用于比较压控振荡器的输入信号和输出信号之间的相位差. 负反馈 ...

  8. 【转载】超级系统工具Sysdig,比 strace、tcpdump、lsof 加起来还强大

    可以用sysdig命令做很多很酷的事情 网络 查看占用网络带宽最多的进程 sysdig -c topprocs_net 显示主机192.168.0.1的网络传输数据 as binary: sysdig ...

  9. 简说Python之数字和变量

    目录 Python的运算 Python关于进制的一些描述 十六进制的显示 八进制和二进制的显示 转成二进制,八进制,十六进制的方法 二,八,十六进制转回十进制的方法 Python变量 数字类型 浮点数 ...

  10. 谷歌 hackbar 不能使用的问题

    谷歌 hackbar 不能使用的问题 下载 hackbar 插件:https://github.com/Mr-xn/hackbar2.1.3 解压文件,将其拖入 chrome 扩展程序中 点击详情,点 ...