【教3妹学编程-算法题】统计区间中的整数数目

2023-12-17 10:20

本文主要是介绍【教3妹学编程-算法题】统计区间中的整数数目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

插: 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
坚持不懈,越努力越幸运,大家一起学习鸭~~~

吃瓜

2哥 : 3妹早啊,大周末的起这么早,在干嘛呢?
3妹:没什么事,随便上上网,2哥,你有没有看到网上“董宇辉小作文事件”
2哥 : 看到了,董宇辉是个很有才华的人。他反对饭圈文化,文案有自己写的,也有小编写的
3妹:是啊,本来感觉事情不大,就是员工内部矛盾,没想到现在闹这么大啦!
2哥 : 甄选的CEO竟然说董宇辉的工资待遇,这不是没文矛盾嘛。
3妹:不知道这件事会如何收场,2哥你觉得呢?
2哥 : 我统计了下网上的几种说法:1、离职创业。 2、离职去其他家。
3妹:切, 网上统计的不准确啊。
2哥:哎,我们还是坐等后续吧, 不过真心希望董宇辉的才华不要被埋没。
3妹:说到统计,我今天倒是看到了一个关于统计的题目,让我们来做一下吧:

考考你

题目:

给你区间的 空 集,请你设计并实现满足要求的数据结构:

新增:添加一个区间到这个区间集合中。
统计:计算出现在 至少一个 区间中的整数个数。
实现 CountIntervals 类:

CountIntervals() 使用区间的空集初始化对象
void add(int left, int right) 添加区间 [left, right] 到区间集合之中。
int count() 返回出现在 至少一个 区间中的整数个数。
注意:区间 [left, right] 表示满足 left <= x <= right 的所有整数 x 。

示例 1:

输入
[“CountIntervals”, “add”, “add”, “count”, “add”, “count”]
[[], [2, 3], [7, 10], [], [5, 8], []]
输出
[null, null, null, 6, null, 8]

解释
CountIntervals countIntervals = new CountIntervals(); // 用一个区间空集初始化对象
countIntervals.add(2, 3); // 将 [2, 3] 添加到区间集合中
countIntervals.add(7, 10); // 将 [7, 10] 添加到区间集合中
countIntervals.count(); // 返回 6
// 整数 2 和 3 出现在区间 [2, 3] 中
// 整数 7、8、9、10 出现在区间 [7, 10] 中
countIntervals.add(5, 8); // 将 [5, 8] 添加到区间集合中
countIntervals.count(); // 返回 8
// 整数 2 和 3 出现在区间 [2, 3] 中
// 整数 5 和 6 出现在区间 [5, 8] 中
// 整数 7 和 8 出现在区间 [5, 8] 和区间 [7, 10] 中
// 整数 9 和 10 出现在区间 [7, 10] 中

提示:

1 <= left <= right <= 10^9
最多调用 add 和 count 方法 总计 10^5 次
调用 count 方法至少一次

思路:

思考

平衡二叉搜索树,
用一棵平衡二叉搜索树维护插入的区间,树中的区间两两不相交。当插入一个新的区间时,需要找出所有与待插入区间有重合整数的区间,将这些区间合并成一个新的区间后插入平衡树里。间隔包含两个属性,左端点 l和右端点 r,其中左端点在树中参与排序。当插入一个新的间隔 add(left,right)时,需要找到树中的最大的间隔 interval满足:interval.l≤right,这个是可能与待插入的间隔相交的最大的间隔,如果相交,则将它们合并,并且继续寻找下一个这样的间隔,直到不存在这样的间隔或者找到的间隔与待插入的间隔不相交。同时用一个整数 cnt维护树中的间隔覆盖的整数,当调用 coun时,直接返回即可。

java代码:

class CountIntervals {TreeMap<Integer, Integer> map = new TreeMap<>();int cnt = 0;public CountIntervals() {}public void add(int left, int right) {Map.Entry<Integer, Integer> interval = map.floorEntry(right);while (interval != null && interval.getValue() >= left) {int l = interval.getKey(), r = interval.getValue();left = Math.min(left, l);right = Math.max(right, r);cnt -= r - l + 1;map.remove(l);interval = map.floorEntry(right);}cnt += (right - left + 1);map.put(left, right);}public int count() {return cnt;}
}

这篇关于【教3妹学编程-算法题】统计区间中的整数数目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/504036

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

一文详解SQL Server如何跟踪自动统计信息更新

《一文详解SQLServer如何跟踪自动统计信息更新》SQLServer数据库中,我们都清楚统计信息对于优化器来说非常重要,所以本文就来和大家简单聊一聊SQLServer如何跟踪自动统计信息更新吧... SQL Server数据库中,我们都清楚统计信息对于优化器来说非常重要。一般情况下,我们会开启"自动更新

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为