首页 > 其他分享 >2023-12-16 每天一练

2023-12-16 每天一练

时间:2023-12-17 11:12:12浏览次数:30  
标签:index 12 16 self interval right mp 2023 left

LeetCode 每日一题

2276. 统计区间中的整数数目

题目

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

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

实现 CountIntervals 类:

  • CountIntervals() 使用区间的空集初始化对象
  • void add(int left, int right) 添加区间 [left, right] 到区间集合之中。
  • int count() 返回出现在 至少一个 区间中的整数个数。

注意:区间 [left, right] 表示满足 left <= x <= right 的所有整数 x

解答

看到区间问题,首先想到 前缀和,树状数组,线段树。

不过该题的重点不是数组区间中的元素,而是区间的 位置 和 大小
可以考虑 平衡搜索树 和 有序映射(如拓展中的第一题),用来记录区间位置,再用一个变量记录 各个区间大小之和 即可
对于 平衡搜索树 来说,节点的值表示为left,因为用其来排序,并在节点中记录 right 的值

from sortedcontainers import SortedDict

class CountIntervals:

    def __init__(self):
        self.mp = SortedDict()
        self.cnt = 0

    def add(self, left: int, right: int) -> None:
		# 使用 bisect_right() 方法在有序字典 self.mp 中找到右边界 right 应插入的位置,并将结果保存在变量 interval_index 中。
        interval_index = self.mp.bisect_right(right)
		# 为了确保 interval_index 在有效范围内
        if interval_index != 0:
			# 因为现在的 interval_index 代表的区间的left > right,所以 interval_index 需要减一
            interval_index -= 1
		# 此时 节点.left 必然小于 right,然后 判断 节点.right 和 left 的关系
        while interval_index < len(self.mp) and self.mp.keys()[interval_index] <= right \
                                            and self.mp.values()[interval_index] >= left:
            l, r = self.mp.items()[interval_index]
            left = min(left, l)
            right = max(right, r)
            self.cnt -= r - l + 1
            self.mp.popitem(interval_index)
			# 若 节点.left > left ||  节点.right < right,则需要继续搜索
			# 所以下面的 interval_index 并未直接简单地 加减一
            interval_index = self.mp.bisect_right(right)
            if interval_index != 0:
                interval_index -= 1
        self.cnt += right - left + 1
        self.mp[left] = right

    def count(self) -> int:
        return self.cnt

拓展

类似题目:

  1. 715. Range 模块

依据灵神的网站 题目顺序

今日未做

标签:index,12,16,self,interval,right,mp,2023,left
From: https://www.cnblogs.com/SpiritiualWander/p/17908868.html

相关文章

  • 2023-2024-1 20231410刘珈岐《计算机基础与程序设计》第12周学习总结
    2023-2024-120231410刘珈岐《计算机基础与程序设计》第12周学习总结作业信息这个作业属于哪个课程(https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP)这个作业要求在哪里(https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13008)这个作业的......
  • 2023-2024-1 20232320 《网络空间安全导论》第六周学习总结
    教材学习内容总结本章主要聚焦于应用安全,具体分为身份认证与信任管理、隐私保护、云计算及其安全、区块链与安全、人工智能及其安全等多个方面,从用户端、服务端等不同视角描述了如何保障应用安全。我们体会到其重要性和实用性,在各个领域都有不可忽视的地位,在历史上,由于这些方面的......
  • 2023-2024-1 20231312 《计算机基础与程序设计》第12周学习总结
    作业信息这个作业属于哪个课程<班级的链接>2023-2024-1-计算机基础与程序设计|-这个作业要求在哪里<作业要求链接>2023-2024-1计算机基础与程序设计第6周作业|这个作业的目标《C语言程序设计》第11章|作业正文作业链接教材学习内容总结《C》指针在一......
  • 2023-2024-1 学号20231318《计算机基础与程序设计》第十二周学习总结
    作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第十二周作业这个作业的目标自学教材《C语言程序设计》第11章并完成云班课测试。作业正文2023-2024-1学号20231318《计算机基础与程序设计》......
  • 学期:2023-2024-1 学号:20231426 《计算机基础与程序设计》第十二周学习总结
    作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计作业这个作业的目标通过教材内容了解文件,动态数组作业正文https://www.cnblogs.com/hhaxx/p/17908761.html教材学习内容总结《计算科学......
  • 2023-2024 20232319《网络空间安全导论》第6周学习总结
    思维导图学习内容挖掘身份认证与信息管理身份认证的主要方法1.用户名/口令:例如QQ微信密码等,其实质是口令,而非真正意义上的密码。2.动态口令/一次性口令:短信验证码,邮件验证码。3.挑战应答认证:非对称密码及数字签名的应用。4.基于生物特征和物性特征:指纹认证,人脸认证,声纹认......
  • 11.16
    今日学习内容<%@pageimport="java.sql.DriverManager"%><%@pageimport="java.sql.*"%><%--CreatedbyIntelliJIDEA.TochangethistemplateuseFile|Settings|FileTemplates.--%><%@pagecontentType="text/htm......
  • openGauss学习笔记-161 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_d
    openGauss学习笔记-161openGauss数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-导出所有数据库-无权限角色导出数据161.1无权限角色导出数据gs_dump和gs_dumpall通过-U指定执行导出的用户帐户。如果当前使用的帐户不具备导出所要求的权限时,会无法导出......
  • 2023.12.16——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.c#明日计划:学习......
  • 12.16
    上午并没有奥赛课但是感觉化学和语文老师(男的)都挺有意思的尤其是我们的数学老师,刚退一线的数奥教练,年纪不小了,冬天只穿一件棉衣就在教学楼里晃悠,光凭这点直接吊打里里外外穿四层还嫌冷的我下午学校非要在四节奥赛课中间夹了一节物理/生物自习,而且被我们上成了公自(因为没人留......