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

Leecode刷题C语言之我的日程安排表②

执行结果:通过

执行用时和内存消耗如下:

 

 

 


typedef struct {int start;int end;
}BOOKING;#define MAX_BOOK_NUM (1000)
typedef struct MyCalendar_ {BOOKING book[MAX_BOOK_NUM];int bnum;BOOKING *sorted[MAX_BOOK_NUM];int num;int conflict[MAX_BOOK_NUM];int cnum;BOOKING cbook[MAX_BOOK_NUM];struct MyCalendar_ *next;
} MyCalendar;#define MAX_OVERLAP_NUM (2)
typedef struct {MyCalendar calendar[MAX_OVERLAP_NUM];
} MyCalendarTwo;MyCalendarTwo* myCalendarTwoCreate() {MyCalendarTwo* obj = (MyCalendarTwo*)malloc(sizeof(MyCalendarTwo));memset(obj, 0, sizeof(MyCalendarTwo));int i;for (i = 0; i < MAX_OVERLAP_NUM - 1; i++) {obj->calendar[i].next = &obj->calendar[i+1];}obj->calendar[i].next = NULL;return obj;
}void myCalendarInsert(MyCalendar *obj, int pos, int start, int end) {assert(pos <= obj->num);BOOKING *b = &obj->book[obj->bnum++];b->start = start;b->end = end;memmove(&obj->sorted[pos+1], &obj->sorted[pos], sizeof(BOOKING *)*(obj->num-pos));obj->sorted[pos] = b;obj->num++;
}void myCalendarRemove(MyCalendar *obj, int pos, int num) {assert(pos >= 0);assert(pos + num <= obj->num);int size = obj->num - pos - num;memmove(&obj->sorted[pos], &obj->sorted[pos+num], sizeof(BOOKING *)*size);obj->num -= num;
}bool myCalendarCheck(MyCalendar *obj, int start, int end) {if (!obj->num) {return true;}int left = 0;int right = obj->num - 1;if (end <= obj->sorted[left]->start) {return true;}if (start >= obj->sorted[right]->end) {return true;}while(left < right) {int mid = left + (right - left) / 2;if (start > obj->sorted[mid]->start) {left = mid + 1;}else {right = mid;}}if (end > obj->sorted[left]->start) {return false;}if (left - 1 >= 0 && obj->sorted[left-1]->end > start) {return false;}return true;
}void myCalendarBookInternal(MyCalendar *obj, int start, int end) {if (!obj->num) {myCalendarInsert(obj, 0, start, end);return;}int left = 0;int right = obj->num - 1;if (end <= obj->sorted[left]->start) {myCalendarInsert(obj, 0, start, end);return;}if (start >= obj->sorted[right]->end) {myCalendarInsert(obj, obj->num, start, end);return;}while(left < right) {int mid = left + (right - left) / 2;if (start > obj->sorted[mid]->start) {left = mid + 1;}else {right = mid;}}myCalendarInsert(obj, left, start, end);return;
}bool myCalendarBook(MyCalendar *obj, int start, int end) {if (!myCalendarCheck(obj->next, start, end)) {return false;}if (!obj->num) {myCalendarInsert(obj, obj->num, start, end);return true;}int left = 0;int right = obj->num - 1;if (end <= obj->sorted[left]->start) {myCalendarInsert(obj, 0, start, end);return true;}if (start >= obj->sorted[right]->end) {myCalendarInsert(obj, obj->num, start, end);return true;}if (start >= obj->sorted[right]->start) {left = obj->num;}else if (start <= obj->sorted[0]->start) {left = 0;}else {while(left < right) {int mid = left + (right - left) / 2;if (start > obj->sorted[mid]->start) {left = mid + 1;}else {right = mid;}}}int ustart = start;int uend = end;obj->cnum = 0;int pos = left;if (left - 1 >= 0 && obj->sorted[left-1]->end > start) {BOOKING *b = obj->sorted[left-1];ustart = ustart < b->start ? ustart : b->start;uend = uend > b->end ? uend : b->end;int nstart = start;int nend = b->end < end ? b->end : end;pos--;obj->cbook[obj->cnum].start = nstart;obj->cbook[obj->cnum].end = nend;obj->conflict[obj->cnum++] = left - 1;}for (int i = left; i < obj->num; i++) {BOOKING *b = obj->sorted[i];if (end <= b->start) {break;}int nstart = b->start;int nend = b->end < end ? b->end : end;ustart = ustart < b->start ? ustart : b->start;uend = uend > b->end ? uend : b->end;obj->cbook[obj->cnum].start = nstart;obj->cbook[obj->cnum].end = nend;obj->conflict[obj->cnum++] = i;}for (int i = 0; i < obj->cnum; i++) {BOOKING *b = &obj->cbook[i];myCalendarBookInternal(obj->next, b->start, b->end);}myCalendarRemove(obj, pos, obj->cnum);myCalendarInsert(obj, pos, ustart, uend);return true;
}bool myCalendarTwoBook(MyCalendarTwo* obj, int start, int end) {MyCalendar *c = &obj->calendar[0];bool success = myCalendarBook(c, start, end);return success;
}void myCalendarTwoFree(MyCalendarTwo* obj) {free(obj);
}

解题思路:

这段代码实现了一个二级日历预约系统,允许用户在不同的日历上预约时间段,并检查预约是否存在冲突。下面是代码的详细思路:

数据结构设计

  1. BOOKING 结构体
    • 存储单个预约的起始时间 start 和结束时间 end
  2. MyCalendar 结构体
    • book 数组:存储所有预约的详细信息。
    • bnum:当前已存储的预约数量。
    • sorted 指针数组:存储指向 book 数组中预约的指针,这些预约按起始时间排序。
    • numsorted 数组中存储的预约数量。
    • conflict 数组:用于存储冲突预约在 sorted 数组中的索引。
    • cnum:当前冲突的数量。
    • cbook 数组:用于临时存储冲突预约的合并结果。
    • next 指针:指向下一个 MyCalendar 实例,用于实现二级日历系统。
  3. MyCalendarTwo 结构体
    • calendar 数组:存储多个 MyCalendar 实例,实现二级日历系统。这里只使用了两个日历的索引空间(MAX_OVERLAP_NUM 定义为 2),但实际上可以扩展以支持更多日历。

函数实现

  1. myCalendarTwoCreate 函数
    • 创建一个 MyCalendarTwo 实例。
    • 初始化所有成员变量。
    • 将 MyCalendar 实例链接成一个单向链表(尽管这里只使用了两个实例,链表的概念仍然适用)。
  2. myCalendarInsert 函数
    • 在 sorted 数组的指定位置插入一个新的预约。
    • 使用 memmove 函数移动元素以腾出空间。
  3. myCalendarRemove 函数
    • 从 sorted 数组中删除指定数量的预约。
    • 使用 memmove 函数移动元素以覆盖被删除的元素。
  4. myCalendarCheck 函数
    • 检查一个新的预约是否与现有的预约冲突。
    • 使用二分查找提高查找效率。
  5. myCalendarBookInternal 函数
    • 在不考虑冲突检查的情况下,将一个预约插入到 MyCalendar 实例中。
    • 使用二分查找确定插入位置。
  6. myCalendarBook 函数
    • 检查并尝试在 MyCalendar 实例中预约一个时间段。
    • 如果存在冲突,则尝试在下一级日历(next 指向的日历)中预约冲突部分。
    • 更新当前日历中的预约,合并冲突预约并删除旧的冲突预约。
  7. myCalendarTwoBook 函数
    • 在二级日历系统中预约一个时间段。
    • 目前只使用了第一个 MyCalendar 实例进行预约。
  8. myCalendarTwoFree 函数
    • 释放 MyCalendarTwo 实例所占用的内存。

总结

这段代码实现了一个复杂的二级日历预约系统,具有以下特点:

  • 支持在多个级别上进行预约。
  • 使用二分查找提高查找效率。
  • 能够处理预约冲突,并尝试在下一级日历中预约冲突部分。
  • 提供了创建、预约和释放资源的接口。

然而,代码中存在一些潜在的问题和改进点:

  • MyCalendar 实例之间的链表连接仅用于实现二级日历的概念,但实际上并未充分利用这一结构。在当前的实现中,只使用了第一个 MyCalendar 实例。
  • 内存管理需要谨慎处理,特别是在释放资源时,要确保不会泄露内存或访问已释放的内存。
  • 代码的可读性和可维护性可以通过更好的注释和重构来提高。

相关文章:

Leecode刷题C语言之我的日程安排表②

执行结果:通过 执行用时和内存消耗如下&#xff1a; typedef struct {int start;int end; }BOOKING;#define MAX_BOOK_NUM (1000) typedef struct MyCalendar_ {BOOKING book[MAX_BOOK_NUM];int bnum;BOOKING *sorted[MAX_BOOK_NUM];int num;int conflict[MAX_BOOK_NUM];int c…...

十二、Vue 路由

文章目录 一、简介二、安装与基本配置安装 Vue Router创建路由实例在应用中使用路由实例三、路由组件与视图路由组件的定义与使用四、动态路由动态路由参数的定义与获取动态路由的应用场景五、嵌套路由嵌套路由的概念与配置嵌套路由的应用场景六、路由导航<router - link>…...

smell---Paddle-DI

跨模态文档智能大模型–Ernie-Layout 目标&#xff1a;提取文档中无结构或半结构化的知识 github项目地址 Paddle NLP ERNIE-Layout基于Transformer Encode架构&#xff0c;并提出以下trick&#xff1a; 1、OCR工具提取信息 借助OCR工具提取图片中的文字及文字对应的坐标信息…...

PCL点云库入门——PCL库点云特征之点云法向量(NormalEstimation)及其可视化

1、PCL点云库中点云特征综述 1.1、点云特征综述 点云特征描述在三维数据处理领域扮演着至关重要的角色&#xff0c;它直接决定了后续的识别、分类以及重建等关键任务的执行效果。在众多的特征描述方法中&#xff0c;我们可以看到基于几何形状的特征、基于统计信息的特征以及…...

25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)

一、JUC 简介 JUC 是 java.util.concurrent 工具包的简称&#xff0c;这是一个处理线程的工具包&#xff0c;从 JDK1.5 开始出现 二、进程与线程 1、基本介绍 &#xff08;1&#xff09;进程 进程是计算机中的程序关于某数据集合上的一次运行活动&#xff0c;是系统进行资源…...

Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测

大家觉得有意义和帮助记得关注和点赞&#xff01;&#xff01;&#xff01; io_uring 是 2019 年 Linux 5.1 内核首次引入的高性能 异步 I/O 框架&#xff0c;能显著加速 I/O 密集型应用的性能。 但如果你的应用已经在使用 传统 Linux AIO 了&#xff0c;并且使用方式恰当&…...

Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能

Uniapp中使用wxml-to-canvas开发DOM生成图片功能 在移动端开发中&#xff0c;生成图片是一个常见需求&#xff0c;例如用于分享海报、生成动态二维码等。在Uniapp框架中&#xff0c;我们可以通过wxml-to-canvas插件轻松实现将DOM转化为图片的功能。本文将详细介绍如何在Uniapp…...

Linux之ARM(MX6U)裸机篇----5.仿stm32的LED驱动实验

一&#xff0c;启动文件 .global _start .global _bss_start /* 类似宏定义把__bss_start定义为_bss_start */ _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:#设置处理器进入SVC模式mrs r0, cpsr /* 读取cpsr到r0 */bic r0, r0, …...

DVWA靶场Open HTTP Redirect (重定向) 漏洞所有级别通关教程及源码审计

目录标题 Open HTTP Redirectlow源码审计 medium源码审计 high源码审计 impossible源码审计 Open HTTP Redirect HTTP 重定向&#xff08;HTTP Redirect Attack&#xff09;是一种网络&#xff0c;利用 HTTP 协议中的重定向机制&#xff0c;将用户引导至恶意网站或非法页面&am…...

探索 JMeter While Controller:循环测试的奇妙世界

嘿&#xff0c;宝子们&#xff01;今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器&#xff0c;它就像是一把神奇的钥匙&#xff0c;能帮我们打开循环测试的大门&#xff0c;模拟出各种各样复杂又有趣的场景哦&#xff01; 一、While 控制器初印象 想象一下&#xff0c;你…...

Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace

最近需要集成Flutter作为Module&#xff0c;Flutter依赖了第三方库&#xff0c;Gradle是8.0版本。 编译报错&#xff1a; 解决办法是在.android根目录下的build.gradle下新增一行代码&#xff1a; buildscript {ext.kotlin_version "1.8.22"repositories {google()…...

ubuntu支持ssh

Ubuntu 默认是支持 SSH 的&#xff0c;但通常并不会在安装时启用 SSH 服务。为了能够远程连接到 Ubuntu 系统&#xff0c;需要安装并启动 SSH 服务器&#xff08;即 OpenSSH&#xff09;。以下是如何在 Ubuntu 系统中启用和配置 SSH 服务的步骤&#xff1a; 检查 SSH 是否已安…...

浏览器书签智能分类

浏览器书签智能分类工具 最近发现浏览器的书签越来越乱了&#xff0c;主要是因为自己太懒&#xff0c;其次之前建的分类太多又乱&#xff0c;重新手动整理确实比较烦。因此有了这个小项目。借助智谱AI的力量对书签进行重新分类。 项目简介 本工具用于自动整理浏览器书签&…...

通俗易懂的讲一下Vue的双向绑定和React的单向绑定

1.Vue 的双向绑定&#xff1a; <template><!-- 输入框和数据自动绑定&#xff0c;就像连体婴儿&#xff0c;一个动另一个也动 --><input v-model"message"><p>{{ message }}</p><!-- 完整表单示例 --><form><!-- 所有…...

Redis 深度解析:从入门到精通

引言 Redis 是一个开源的、高性能的键值存储系统&#xff0c;它支持多种数据结构&#xff0c;并且提供了丰富的功能和接口。作为内存数据库&#xff0c;Redis 以其快速的数据访问速度、灵活的数据模型以及持久化选项而闻名。本文将详细介绍 Redis 的核心概念、工作原理及其应用…...

基于物联网的冻保鲜运输智能控制系统

基于物联网的冻保鲜运输智能控制系统设计文档 1. 项目开发背景 随着全球化贸易的发展&#xff0c;冷链物流在现代运输行业中扮演着日益重要的角色。尤其是冻品、食品、药品等对运输环境有着严格要求的货物&#xff0c;其运输过程中温度、湿度等环境参数必须严格控制&#xff…...

【深度学习基础之多尺度特征提取】多尺度卷积神经网络(MS-CNN)是如何在深度学习网络中提取多尺度特征的?附代码(二)

【深度学习基础之多尺度特征提取】多尺度卷积神经网络&#xff08;MS-CNN&#xff09;是如何在深度学习网络中提取多尺度特征的&#xff1f;附代码&#xff08;二&#xff09; 【深度学习基础之多尺度特征提取】多尺度卷积神经网络&#xff08;MS-CNN&#xff09;是如何在深度…...

论文解读之learning to summarize with human feedback

最近在看大模型训练相关的论文&#xff0c;预计会追溯经典的和最新的训练策略以及微调原理等 本次解读经典论文learning to summarize with human feedback 一、简介 部分生成任务需要对齐人类偏好&#xff0c;但是根据最大化可能性&#xff08;对数似然&#xff09;进行微调…...

STM32学习(六 )

串口初始化IO引脚 串口的引脚在哪里 串口可以利用GPIO_InitTypeDef结构体和GPIO_Init&#xff08;&#xff09;函数进行初始化 USART_InitTypeDef USART_InitStruct;//建立串口结构体USART_InitStruct.USART_BaudRate 115200;//波特率115200USART_InitStruct.USART_Mode US…...

基于 GitHub API 的 Issue 和 PR 自动化解决方案

文章目录 摘要引言优化 Issue 和 PR 管理的方法工具选择流程优化 自动化 Issue 和 PR 管理代码逻辑详解获取 Issue 数据为 Issue 添加标签将 Issue 分配给开发者主逻辑 实际运行效果进一步扩展QA 环节总结参考资料 摘要 在开源项目中&#xff0c;Issue 和 Pull Request&#x…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...