当前位置: 首页 > 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…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

Xcode 16 集成 cocoapods 报错

基于 Xcode 16 新建工程项目&#xff0c;集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

高效的后台管理系统——可进行二次开发

随着互联网技术的迅猛发展&#xff0c;企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心&#xff0c;成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统&#xff0c;它不仅支持跨平台应用&#xff0c;还能提供丰富…...

EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势

一、WebRTC与智能硬件整合趋势​ 随着物联网和实时通信需求的爆发式增长&#xff0c;WebRTC作为开源实时通信技术&#xff0c;为浏览器与移动应用提供免插件的音视频通信能力&#xff0c;在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能&#xff0c;对实时…...

基于Uniapp的HarmonyOS 5.0体育应用开发攻略

一、技术架构设计 1.混合开发框架选型 &#xff08;1&#xff09;使用Uniapp 3.8版本支持ArkTS编译 &#xff08;2&#xff09;通过uni-harmony插件调用原生能力 &#xff08;3&#xff09;分层架构设计&#xff1a; graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...

[特殊字符] Spring Boot底层原理深度解析与高级面试题精析

一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配&#xff0c;通过简化传统Spring应用的初始化和配置流程&#xff0c;显著提升开发效率。其底层原理可拆解为以下核心机制&#xff1a; 自动装配&#xff08;Auto-Configuration&#xff09; 核…...