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

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...