Leetcode打卡:我的日程安排表II

执行结果:通过

题目 731 我的日程安排表II

实现一个程序来存放你的日程安排。如果要添加的时间内不会导致三重预订时,则可以存储这个新的日程安排。

当三个日程安排有一些时间上的交叉时(例如三个日程安排都在同一时间内),就会产生 三重预订

事件能够用一对整数 startTime 和 endTime 表示,在一个半开区间的时间 [startTime, endTime) 上预定。实数 x 的范围为  startTime <= x < endTime

实现 MyCalendarTwo 类:

  • MyCalendarTwo() 初始化日历对象。
  • boolean book(int startTime, int endTime) 如果可以将日程安排成功添加到日历中而不会导致三重预订,返回 true。否则,返回 false 并且不要将该日程安排添加到日历中。

示例 1:

输入:
["MyCalendarTwo", "book", "book", "book", "book", "book", "book"]
[[], [10, 20], [50, 60], [10, 40], [5, 15], [5, 10], [25, 55]]
输出:
[null, true, true, true, false, true, true]解释:
MyCalendarTwo myCalendarTwo = new MyCalendarTwo();
myCalendarTwo.book(10, 20); // 返回 True,能够预定该日程。
myCalendarTwo.book(50, 60); // 返回 True,能够预定该日程。
myCalendarTwo.book(10, 40); // 返回 True,该日程能够被重复预定。
myCalendarTwo.book(5, 15);  // 返回 False,该日程导致了三重预定,所以不能预定。
myCalendarTwo.book(5, 10); // 返回 True,能够预定该日程,因为它不使用已经双重预订的时间 10。
myCalendarTwo.book(25, 55); // 返回 True,能够预定该日程,因为时间段 [25, 40) 将被第三个日程重复预定,时间段 [40, 50) 将被单独预定,而时间段 [50, 55) 将被第二个日程重复预定。

提示:

  • 0 <= start < end <= 109
  • 最多调用 book 1000 次。

代码以及解题思路

代码

from sortedcontainers import SortedDict
class MyCalendarTwo:def __init__(self):self.sd = SortedDict()def book(self, startTime: int, endTime: int) -> bool:self.sd[startTime] = self.sd.get(startTime, 0) + 1self.sd[endTime] = self.sd.get(endTime, 0) - 1s = 0for v in self.sd.values():s += vif s > 2:self.sd[startTime] -= 1self.sd[endTime] += 1return Falsereturn True

解题思路:

. 初始化 SortedDict

  • 在 MyCalendarTwo 类的构造函数 __init__ 中,创建了一个 SortedDict 实例 self.sdSortedDict 是一个自动保持键排序的字典,非常适合于按时间顺序处理键值对。

2. book 方法

  • book 方法接受两个参数 startTime 和 endTime,分别表示新的会议的开始时间和结束时间。
  • 方法的目的是检查并尝试预订这个新的会议时间段,如果在任何时间点上同时进行的会议数不超过 2 个,则返回 True,否则返回 False

3. 处理会议的开始和结束

  • 对于新的会议时间段,我们在 SortedDict 中记录它的开始和结束。
    • 使用 self.sd[startTime] = self.sd.get(startTime, 0) + 1 增加 startTime 处的计数,表示一个新的会议开始。
    • 使用 self.sd[endTime] = self.sd.get(endTime, 0) - 1 减少 endTime 处的计数,表示一个会议结束。
  • 这样,通过遍历 SortedDict 的值,我们可以计算出任意时间点上的会议数量。

4. 遍历并检查会议重叠

  • 初始化一个变量 s 为 0,用于跟踪当前时间点的会议数量。
  • 遍历 SortedDict 的值(这些值代表会议的开始和结束事件导致的计数变化),逐步更新 s
    • 每当遇到一个开始事件(正数),将 s 增加相应的值。
    • 每当遇到一个结束事件(负数),将 s 减少相应的值。
  • 在遍历过程中,如果 s 的值在任何时间点超过了 2,表示此时有三个或更多的会议同时进行,因此不能添加新的会议时间段。
    • 如果发生这种情况,我们需要回滚对 SortedDict 的修改(即减少 startTime 的计数并增加 endTime 的计数),然后返回 False

5. 返回结果

  • 如果遍历结束后没有超过 2 个会议同时进行的情况,则新的会议时间段可以被成功预订,返回 True

总结

通过巧妙地使用 SortedDict 来记录会议的开始和结束,并实时跟踪任意时间点上的会议数量,这个算法高效地解决了检查会议时间段是否可以添加的问题。这种方法避免了直接检查所有可能的时间重叠,从而大大提高了效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/64972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现一个通用的树形结构构建工具

文章目录 1. 前言2. 树结构3. 具体实现逻辑3.1 TreeNode3.2 TreeUtils3.3 例子 4. 小结 1. 前言 树结构的生成在项目中应该都比较常见&#xff0c;比如部门结构树的生成&#xff0c;目录结构树的生成&#xff0c;但是大家有没有想过&#xff0c;如果在一个项目中有多个树结构&…

day30-awk进阶

awk模式种类 awk的模式分为这几种 正则表达式 基本正则扩展正则比较表达式范围表达式特殊模式 BEGINEND awk比较运算符&#xff08;语法&#xff09; 关系运算符解释示例<小于x<y<小于等于x<y等于xy!不等于x!y>大于等于x>y>大于x>y~匹配正则x~/正则…

大语言模型(LLM)一般训练过程

大语言模型(LLM)一般训练过程 数据收集与预处理 收集:从多种来源收集海量文本数据,如互联网的新闻文章、博客、论坛,以及书籍、学术论文、社交媒体等,以涵盖丰富的语言表达和知识领域。例如,训练一个通用型的LLM时,可能会收集数十亿甚至上百亿字的文本数据.清洗:去除…

数据库新建用户后(Host:%),报错:localhost无法连接

存在问题 在给数据库&#xff08;MySQL、MariaDB等&#xff09;创建了新的用户名&#xff08;eg&#xff1a;maxscale&#xff09;后&#xff0c;无法使用新用户名登录&#xff0c;并报如下错误&#xff1a;ERROR 1045 (28000): Access denied for user maxscalelocalhost (us…

2024年大型语言模型(LLMs)的发展回顾

2024年对大型语言模型&#xff08;LLMs&#xff09;来说是充满变革的一年。以下是对过去一年中LLMs领域的关键进展和主题的总结。 GPT-4的壁垒被打破 去年&#xff0c;我们还在讨论如何构建超越GPT-4的模型。如今&#xff0c;已有18个组织拥有在Chatbot Arena排行榜上超越原…

数据挖掘——支持向量机分类器

数据挖掘——支持向量机分类器 支持向量机最小间隔面推导基于软间隔的C-SVM非线性SVM与核变换常用核函数 支持向量机 根据统计学习理论&#xff0c;学习机器的实际风险由经验风险值和置信范围值两部分组成。而基于经验风险最小化准则的学习方法只强调了训练样本的经验风险最小…

检索增强生成

概述 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;是一种将信息检索与语言模型相结合的技术。由Facebook AI Research于2020年提出&#xff0c;它把数据库的优势与语言模型的优势相结合。它能让模型从外部知识库中检索信息&#xff0c…

在 SQL 中,区分 聚合列 和 非聚合列(nonaggregated column)

文章目录 1. 什么是聚合列&#xff1f;2. 什么是非聚合列&#xff1f;3. 在 GROUP BY 查询中的非聚合列问题示例解决方案 4. 为什么 only_full_group_by 要求非聚合列出现在 GROUP BY 中&#xff1f;5. 如何判断一个列是聚合列还是非聚合列&#xff1f;6. 总结 在 SQL 中&#…

ETL处理工具Kettle入门

1. Kettle简介 Kettle&#xff08;现已更名为Pentaho Data Integration&#xff0c;简称PDI&#xff09;是一个开源的ETL工具&#xff0c;能够进行数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;。它是…

petalinux2017.4对linux4.9.0打实时补丁

准备工作&#xff1a; 1.windows&#xff1a;安装vivado 2017.4&#xff0c;xilinx sdk 2017.4 2.ubuntu16.04&#xff1a;安装petalinux 2017 3.黑金ax7020&#xff0c;sd卡 一、准备linux内核的操作系统 1.1 Petalinux配置 Petalinux使用教程-CSDN博客非常详细&#xf…

Maven 教程之 pom.xml 详解

Maven 教程之 pom.xml 详解 pom.xml 简介 什么是 pom POM 是 Project Object Model 的缩写,即项目对象模型。 pom.xml 就是 maven 的配置文件,用以描述项目的各种信息。 pom 配置一览 <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi

Golang的缓存一致性策略

Golang的缓存一致性策略 一致性哈希算法 在Golang中&#xff0c;缓存一致性策略通常使用一致性哈希算法来实现。一致性哈希算法能够有效地解决缓存节点的动态扩容、缩容时数据重新分布的问题&#xff0c;同时能够保证数据访问的均衡性。 一致性哈希算法的核心思想是将节点的哈希…

【机器学习:一、机器学习简介】

机器学习是当前人工智能领域的重要分支&#xff0c;其目标是通过算法从数据中提取模式和知识&#xff0c;并进行预测或决策。以下从 机器学习概述、有监督学习 和 无监督学习 三个方面进行介绍。 机器学习概述 机器学习定义 机器学习&#xff08;Machine Learning&#xff0…

蓝桥杯JAVA--003

需求 2.代码 public class RegularExpressionMatching {public boolean isMatch(String s, String p) {if (p.isEmpty()) {return s.isEmpty();}boolean firstMatch !s.isEmpty() && (s.charAt(0) p.charAt(0) || p.charAt(0) .);if (p.length() > 2 && p…

被催更了,2025元旦源码继续免费送

“时间从来不会停下&#xff0c;它只会匆匆流逝。抓住每一刻&#xff0c;我们才不会辜负自己。” 联系作者免费领&#x1f496;源&#x1f496;码。 三联支持&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 更多内容敬请期待。如有需要源码可以联系作者免…

WebRTC的线程事件处理

1. 不同平台下处理事件的API&#xff1a; Linux系统下&#xff0c;处理事件的API是epoll或者select&#xff1b;Windows系统下&#xff0c;处理事件的API是WSAEventSelect&#xff0c;完全端口&#xff1b;Mac系统下&#xff0c;kqueue 2. WebRTC下的事件处理类&#xff1a; …

关于Zotero

1、文献数据库&#xff1a; Zotero的安装 Zotero安装使用_zotero只能安装在c盘吗-CSDN博客 2、如何使用zotero插件 我刚下载的时候就结合使用的是下面的这两个博主的分享&#xff0c;感觉暂时是足够的。 Zotero入&#x1f6aa;基础 - 小红书 Green Frog申请easyscholar密钥…

企业三要素如何用PHP实现调用

一、什么是企业三要素&#xff1f; 企业三要素即传入的企业名称、法人名称、社会统一信用代码或注册号&#xff0c;校验此三项是否一致。 二、具体怎么样通过PHP实现接口调用&#xff1f; 下面我们以阿里云为例&#xff0c;通过PHP示例代码进行调用&#xff0c;参考如下&…

Go 语言中强大的配置管理库—Viper

Viper 是 Go 语言中强大的配置管理库&#xff0c;广泛用于云原生和微服务开发中。它支持多种配置文件格式&#xff08;如 YAML、JSON、TOML 等&#xff09;、环境变量、命令行参数以及远程配置管理。 Viper 的主要功能 1. 支持多种格式的配置文件&#xff1a; • YAML、JSON…

鸿蒙-封装loading动画

import { AnimatorOptions, AnimatorResult } from "kit.ArkUI" export enum SpinImageType { RedLoading, WhiteLoading } Component export struct SpinImage { Prop type?: SpinImageType Prop url?: string State animatedValue: number 0 …