日程表

请实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排,则可以存储这个新的日程安排。
MyCalendar 有一个 book(int start, int end)方法。它意味着在 start 到 end 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为, start <= x < end。
当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生重复预订。
每次调用 MyCalendar.book方法时,如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true。否则,返回 false 并且不要将该日程安排添加到日历中。
请按照以下步骤调用 MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)

方法一

暴力搜索,用一个list存下每个输入的时间,每来一个新的,遍历list,看新的是否符合条件

代码

class MyCalendar:def __init__(self):self.allDate = list()def book(self, start: int, end: int) -> bool:for arr in self.allDate:if start < arr[1] and end > arr[0]:return Falseself.allDate.append([start, end])return True

方法二

自定义二叉搜索树BST),普通BST只维护了一个元素值,这里为了每次能快速找到给定区间在BST中的正确位置,让BST维护一个区间,即(start, end),凡是比当前节点start更小的end所在区间应该在当前节点的左子树,凡是比当前节点的end更大的start所在区间应该在当前节点的右子树。这两个情况都不符合的区间即存在交集的区间,不应该被插入到树中。

代码

class Avl:def __init__(self, start, end):self.start = startself.end = endself.left, self.right = None, Noneclass MyCalendar:def __init__(self):self.allDate = Nonedef insert(self, root: Avl, start, end):if end <= root.start:if not root.left:root.left = Avl(start, end)return Truereturn self.insert(root.left, start, end)elif start >= root.end:if not root.right:root.right = Avl(start, end)return Truereturn self.insert(root.right, start, end)else:return Falsedef book(self, start: int, end: int) -> bool:if not self.allDate:self.allDate = Avl(start, end)return Truereturn self.insert(self.allDate, start, end)

【LeetCode】日程表相关推荐

  1. 【Datawhale】之LeetCode分类练习(分治)

    分治介绍 主要思想 分治算法的主要思想是将原问题递归地分成若干个子问题,直到子问题满足边界条件,停止递归.将子问题逐个击破(一般是同种方法),将已经解决的子问题合并,最后,算法会层层合并得到原问题的答 ...

  2. 循环赛日程表 (递归与分治)

    文章目录 1.题目 2.问题分析 3.什么是分治 4.算法实现思路 1.对表进行分析 2.对表的实现 1.递归 2.循环 5算法实现代码 1.递归 2.循环 6.时间\空间复杂度 1.递归 1.空间复 ...

  3. leetcode 5. Longest Palindromic Substring 字符串中的最长回文数 逐步从O(n^2)优化至线性时间

    题目 解析 思路一 暴力解法 思路二 指针+最大长度 思路3 由中间至两边找回数 思路4 Manacher's algorithm 线性时间 参考文档 题目 链接 给定一个字符串 s,找到 s 中最长 ...

  4. LeetCode 10. Regular Expression Matching python特性、动态规划、递归

    前言 本文主要提供三种不同的解法,分别是利用python的特性.动态规划.递归方法解决这个问题 使用python正则属性 import reclass Solution2:# @return a bo ...

  5. leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法

    题目解析 代码如下 题目解析 这一题是一道会员的题目,题目介绍如下: Given a string, find the length of the longest substring T that c ...

  6. leetcode 3. Longest Substring Without Repeating Characters 最长非重复子串的长度 滑动窗口法

    题目链接 根据我们之前介绍的滑动窗口法的解法: 滑动窗口法详解 leetcode 438. Find All Anagrams in a String 滑动窗口法 这题,我们不难解决,使用之前的模板. ...

  7. leetcode:2680 Remove Duplicates from Sorted Array 删除数组中的重复元素

    leetcode:26 对数组元素进行去重,使得原数组重复元素最多保留1个 限制: 我们不可以额外分配数组,必须保持空间复杂度为O(1) 这个并不难实现: class Solution(object) ...

  8. LeetCode简单题之二进制表示中质数个计算置位

    题目 给你两个整数 left 和 right ,在闭区间 [left, right] 范围内,统计并返回 计算置位位数为质数 的整数个数. 计算置位位数 就是二进制表示中 1 的个数. 例如, 21 ...

  9. LeetCode简单题之删除字符使字符串变好

    题目 一个字符串如果没有 三个连续 相同字符,那么它就是一个 好字符串 . 给你一个字符串 s ,请你从 s 删除 最少 的字符,使它变成一个 好字符串 . 请你返回删除后的字符串.题目数据保证答案总 ...

最新文章

  1. HTTP服务器端常用推送技术
  2. 数据库读取image类型发送到前端显示图片
  3. python运行程序-Python程序的执行过程
  4. 步步为营-20-XML
  5. 【Linux】2.Linux source命令
  6. Win:Win系统下安装Linux的Ubuntu系统的简介、安装之详细攻略
  7. (三)虚拟化技术重点笔记与总结
  8. java如何解决高并发症,JAVA线上故障紧急处理详细过程!
  9. windows7系统软件无法卸载的解决方法
  10. 【STM32】HAL库 STM32CubeMX教程五----看门狗(独立看门狗,窗口看门狗)
  11. matlab dynprog,动态规划算法
  12. C++ string类常用函数
  13. 爱情指数测试脸型软件,心理测试:你和谁的脸型最像?测出你的幸运指数是多少!...
  14. php抓取访客国旗,爬取世界各国和地区数据国旗和国徽的高清图标和图片
  15. 【产品】外壳防护等级(IP代码)
  16. 【自定义View】从零开始写一个PDF查看器
  17. 一定能用到的简单但实用的五种按钮样式(HTML+CSS步骤详解,含详细注释)
  18. matlab图论软件包,MATLAB_bgl_toolbox 图论通用工具箱总汇:GraphTheory for St 247万源代码下载- www.pudn.com...
  19. Flutter 打包问题 Could not resolve io.flutter:arm64_v8a_release
  20. 《强化学习》 基本概念和交叉熵方法

热门文章

  1. 保宝网学习工具 v5.6 官方版
  2. 【c/c++编程】促销计算、反序数、进制转换、排版类问题、杨辉三角形、日期类问题
  3. java上传文件到项目路径
  4. 11.25 QLU校赛(2)
  5. Hive常用优化方法总结
  6. 顶底突破同花顺副图指标 波浪类指标
  7. JAVA多线程-常用JUC工具类及阻塞队列
  8. Java 连接Access数据库
  9. 中文自定义字符字形的处理
  10. 红米10x和红米9哪个好