当前位置: 首页 > news >正文

【教3妹学编程-算法题】Range 模块

图片来源网络

3妹:哈哈哈哈哈哈哈哈
2哥 : 3妹看什么呢,笑的这么开森
3妹:2哥你快来看啊,成都欢乐谷的NPC模仿“唐僧”, 太搞笑了。
2哥 : 哦这个我也看到了,真的是唯妙唯肖,不能说像,只能说一模一样。
3妹:哈哈哈哈,西游记翻拍都可以找他助演了~
2哥:3妹今天刷题了嘛?说到模仿,我们今天来做一个模块的题吧~
3妹:咦,2哥你这个弯,拐的有点急啊。 不过是到了刷题时间了, 让我来看一下吧~

搞笑一下

题目:

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) 中当前正在跟踪的每个实数。

示例 1:

输入
[“RangeModule”, “addRange”, “removeRange”, “queryRange”, “queryRange”, “queryRange”]
[[], [10, 20], [14, 16], [10, 14], [13, 15], [16, 17]]
输出
[null, null, null, true, false, true]

解释
RangeModule rangeModule = new RangeModule();
rangeModule.addRange(10, 20);
rangeModule.removeRange(14, 16);
rangeModule.queryRange(10, 14); 返回 true (区间 [10, 14) 中的每个数都正在被跟踪)
rangeModule.queryRange(13, 15); 返回 false(未跟踪区间 [13, 15) 中像 14, 14.03, 14.17 这样的数字)
rangeModule.queryRange(16, 17); 返回 true (尽管执行了删除操作,区间 [16, 17) 中的数字 16 仍然会被跟踪)

提示:

1 <= left < right <= 10^9
在单个测试用例中,对 addRange 、 queryRange 和 removeRange 的调用总数不超过 10^4 次

思路:

思考

列表+二分查找
详见代码:

java代码:

class RangeModule {TreeMap<Integer, Integer> intervals;public RangeModule() {intervals = new TreeMap<Integer, Integer>();}public void addRange(int left, int right) {Map.Entry<Integer, Integer> entry = intervals.higherEntry(left);if (entry != intervals.firstEntry()) {Map.Entry<Integer, Integer> start = entry != null ? intervals.lowerEntry(entry.getKey()) : intervals.lastEntry();if (start != null && start.getValue() >= right) {return;}if (start != null && start.getValue() >= left) {left = start.getKey();intervals.remove(start.getKey());}}while (entry != null && entry.getKey() <= right) {right = Math.max(right, entry.getValue());intervals.remove(entry.getKey());entry = intervals.higherEntry(entry.getKey());}intervals.put(left, right);}public boolean queryRange(int left, int right) {Map.Entry<Integer, Integer> entry = intervals.higherEntry(left);if (entry == intervals.firstEntry()) {return false;}entry = entry != null ? intervals.lowerEntry(entry.getKey()) : intervals.lastEntry();return entry != null && right <= entry.getValue();}public void removeRange(int left, int right) {Map.Entry<Integer, Integer> entry = intervals.higherEntry(left);if (entry != intervals.firstEntry()) {Map.Entry<Integer, Integer> start = entry != null ? intervals.lowerEntry(entry.getKey()) : intervals.lastEntry();if (start != null && start.getValue() >= right) {int ri = start.getValue();if (start.getKey() == left) {intervals.remove(start.getKey());} else {intervals.put(start.getKey(), left);}if (right != ri) {intervals.put(right, ri);}return;} else if (start != null && start.getValue() > left) {if (start.getKey() == left) {intervals.remove(start.getKey());} else {intervals.put(start.getKey(), left);}}}while (entry != null && entry.getKey() < right) {if (entry.getValue() <= right) {intervals.remove(entry.getKey());entry = intervals.higherEntry(entry.getKey());} else {intervals.put(right, entry.getValue());intervals.remove(entry.getKey());break;}}}
}
http://www.lryc.cn/news/226811.html

相关文章:

  • SpringBoot+MybatisPlus Restful示例
  • 【数据结构】树与二叉树(十一):二叉树的层次遍历(算法LevelOrder)
  • 【PyQt】(自制类)处理鼠标点击逻辑
  • JAVA IDEA 下载
  • DevOps简介
  • 体验前所未有的显示器管理体验:BetterDisplay Pro Mac
  • python用pyinstaller打包exe,去掉黑窗口
  • 如何关闭Windows Defender(亲测可行!!非常简单)
  • 【objectarx.net】创建多重引线
  • 【objectarx.net】创建组,列出所有组,查找实体所在的组
  • Llama2通过llama.cpp模型量化 WindowsLinux本地部署
  • Coding面试题之手写线程池
  • 【objectarx.net】删除零长度曲线和获取零长度曲线的数量
  • Win11专业版安装Docker Desktop,并支持映射主机的gpu
  • Mac代码文本编辑器Sublime Text 4
  • MATLAB中plot函数用法
  • win10 安装vscode
  • MATLAB中Arrow 属性说明
  • MYSQL 慢查询和慢查询日志
  • Longhorn跨AZ实现存储高可用
  • maven 私有仓库配置
  • TypeScript: 判断两个数组的内容是否相等
  • STM32MPU6050角度的读取(STM32驱动MPU6050)
  • 海康Visionmaster-环境配置:CSharp 二次开发环境配 置方法
  • Xilinx DDR3 MIG系列——ddr3控制器的时钟架构
  • 2560 动物保护宣传网站设计JSP【程序源码+文档+调试运行】
  • 【算法】牛的旅行(图的直径,floyd算法求最短路)
  • QML12、QML 对象类型
  • JavaWeb Day08 Mybatis-入门
  • 【计算机网络笔记】IP分片