news 2026/4/23 19:14:18

A.每日一题——2402. 会议室 III

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
A.每日一题——2402. 会议室 III

题目链接:2402. 会议室 III(困难)

算法原理:

解法:堆+队列

69ms击败84.18%

时间复杂度O(Nlogn)

①会议排序:将所有会议按开始时间升序排列,保证按时间顺序处理每一场会议
②双优先队列初始化:
空闲队列:小顶堆(按会议室编号排序),优先分配编号小的空闲会议室;
使用队列:小顶堆(先按会议结束时间升序,结束时间相同时按会议室编号升序),优先获取最早结束 / 编号最小的可用会议室
③逐场处理会议:
释放:将当前会议开始前已结束的会议室从 “使用队列” 移回 “空闲队列”;
分配:有空闲会议室则直接分配,无空闲则等待 “使用队列” 中最早结束的会议室,同步延后当前会议的结束时间;
④记录:更新该会议室的使用次数,并将当前会议的结束时间 + 会议室编号加入 “使用队列”
结果统计:遍历统计数组,找到使用次数最多的会议室(次数相同选编号最小的)

答疑

Q1:为什么using队列的类型要用long[]型而不是int[]型呢?

因为处理过程中产生的延迟结束时间必须用long来存储,否则延后的太多int可能会溢出

Q2:为什么比较的是long但compare的返回值不能是long?

因为重写compare方法时,返回值必须是int,咱可以直接用Long.comapre(),因为它已经帮咱处理完long的类型且返回值也是int,也可以相减后强转成int,但不建议

Q3:为什么m是int[][]型的,比较器传的时候却是int[]型呢?为什么using队列是long[]型,比较器传的就是long[]型呢?为什么不是long呢?

就看你是根据什么比较的!

int[][] m的元素是int[]→比较器是Comparator<int[]>,比较两个int[]元素

PriorityQueue<long[]> using的元素是long[]→比较器是Comparator<long[]>,比较两个long[]元素

Java代码:

class Solution { public int mostBooked(int n, int[][] m) { //将所有会议按时间升序排序 // Arrays.sort(m,(a,b)->a[0]-b[0]); Arrays.sort(m,new Comparator<int[]>(){ @Override public int compare(int[] a,int[] b){ return a[0]-b[0]; } }); //建小根堆,优先分配编号小的空闲会议室 PriorityQueue<Integer> id=new PriorityQueue<>(); //初始化 for(int i=0;i<n;i++) id.offer(i); //正在使用的会议室 //格式[结束时间,会议室编号]先按结束时间排序,再把会议室编号小的放前面 //写法一 // PriorityQueue<long[]> using=new PriorityQueue<>( // (a,b)->a[0]!=b[0]?Long.compare(a[0],b[0]):Long.compare(a[1],b[1]) // ); //写法二: // PriorityQueue<long[]> using=new PriorityQueue<>( // (a,b)->a[0]!=b[0]?(int)(a[0]-b[0]):(int)(a[1]-b[1]) // ); //写法三: PriorityQueue<long[]> using=new PriorityQueue<>( new Comparator<long[]>(){ @Override public int compare(long[] a,long[] b){ int tmp=a[0]!=b[0]?1:-1; if(tmp==1) return (int)(a[0]-b[0]); return (int)(a[1]-b[1]); } }); //记录每个会议室被预定的次数,(索引->会议室编号,值->次数) int[] count =new int[n]; //按顺序处理每一场会议 for(int[] t:m){ long start=t[0]; long end=t[1]; //释放当前会议开始前已经结束的会议室 //把结束时间<=当前会议开始时间的会议室放回空闲队列 while(!using.isEmpty()&&using.peek()[0]<=start){ //弹出已结束的会议室,获取其编号并加入空闲队列 int roomid=(int)using.poll()[1]; id.offer(roomid); } int assign;//分配给当前会议的会议室编号 //情况1:有空闲会议室 if(!id.isEmpty()) assign=id.poll(); //情况2:无空闲会议室->等待最早结束的会议室释放 else{ long[] early=using.poll();//弹出最早结束的会议室信息 long endtime=early[0];//该会议室的结束时间 int roomid=(int)early[1];//该会议室的编号 //当前会议需要延时开始,结束时间也同步延 //延后时长=会议室结束时间-当前会议原开始时间 end=end+(endtime-start); assign=roomid;//分配这个刚释放的会议室 } //将当前会议的结束时间和分配的会议室编号加入正在使用的队列 using.offer(new long[]{end,assign}); //该会议室的预定次数+1 count[assign]++; } //找出预定次数最多的会议室,次数相同选编号最小的 int ret=0; for(int i=0;i<n;i++) if(count[i]>count[ret]) ret=i; return ret; } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:12:35

[STM32C0] 【STM32C092RC 测评】+08 定时器1输出可变脉宽

今天对脉冲宽度进行测试&#xff1a;一&#xff1a;PWM脉宽知识分享&#xff1a; PWM&#xff08;脉冲宽度调制&#xff09;的脉冲宽度是指在一个周期内信号处于高电平&#xff08;或有效状态&#xff09;的时间长度&#xff0c;通常用时间单位&#xff08;如微秒μs、毫秒ms&a…

作者头像 李华
网站建设 2026/4/23 10:11:31

[STM32C0] 【STM32C092RC 测评】+ 03 板载串口2输出测试

一&#xff1a;通用同步/异步收发器(USART) 这些设备嵌入四个通用同步/异步接收器/发送器&#xff0c;其通信速度高达6 Mbit/s。 它们提供CTS、RTS和RS485 DE信号的硬件管理、多处理器通信模式、同步SPI通信和单线半双工通信。 双工通信模式。有些还支持智能卡通信(ISO7816)、I…

作者头像 李华
网站建设 2026/4/23 10:11:31

基于springboot的医院资源管理系统(11635)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/4/23 10:13:55

用MCU一个GPIO自锁PMOS就能实现按键开关机

用MCU&#xff08;微控制器&#xff09;一个GPIO控制PMOS自锁来实现按键开关机是一个非常常见且简洁的电路设计。下面详细说明一下如何使用这种方案&#xff1a;1. 基本原理这种设计利用了PMOS晶体管的开关特性。PMOS晶体管通常在源极接正电源、漏极接负载时工作。通过控制其栅…

作者头像 李华
网站建设 2026/4/23 10:09:39

油管十大盈利方式,看你错过了哪些?

嘿&#xff0c;创作者们&#xff01;油管不断扩展和优化其变现工具&#xff0c;红利持续扩大。对于正在考虑内容出海的全球创作者来说&#xff0c;了解并利用这些变现机制&#xff0c;将直接决定你在国际市场上的商业潜力。今天&#xff0c;我们就来深度解析油管提供的十大变现…

作者头像 李华