2026/6/20 13:50:19
网站建设
项目流程
天津网站建设方案咨询,建设网站 怀疑对方传销 网站制作 缓刑,网站建设需要什么样的内容,wampserver和wordpress题目链接#xff1a;2402. 会议室 III#xff08;困难#xff09; 算法原理#xff1a; 解法#xff1a;堆队列 69ms击败84.18% 时间复杂度O(Nlogn) ①会议排序#xff1a;将所有会议按开始时间升序排列#xff0c;保证按时间顺序处理每一场会议 ②双优先队列初始化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[]→比较器是Comparatorint[]比较两个int[]元素PriorityQueuelong[] using的元素是long[]→比较器是Comparatorlong[]比较两个long[]元素Java代码class Solution { public int mostBooked(int n, int[][] m) { //将所有会议按时间升序排序 // Arrays.sort(m,(a,b)-a[0]-b[0]); Arrays.sort(m,new Comparatorint[](){ Override public int compare(int[] a,int[] b){ return a[0]-b[0]; } }); //建小根堆优先分配编号小的空闲会议室 PriorityQueueInteger idnew PriorityQueue(); //初始化 for(int i0;in;i) id.offer(i); //正在使用的会议室 //格式[结束时间会议室编号]先按结束时间排序再把会议室编号小的放前面 //写法一 // PriorityQueuelong[] usingnew PriorityQueue( // (a,b)-a[0]!b[0]?Long.compare(a[0],b[0]):Long.compare(a[1],b[1]) // ); //写法二 // PriorityQueuelong[] usingnew PriorityQueue( // (a,b)-a[0]!b[0]?(int)(a[0]-b[0]):(int)(a[1]-b[1]) // ); //写法三 PriorityQueuelong[] usingnew PriorityQueue( new Comparatorlong[](){ Override public int compare(long[] a,long[] b){ int tmpa[0]!b[0]?1:-1; if(tmp1) return (int)(a[0]-b[0]); return (int)(a[1]-b[1]); } }); //记录每个会议室被预定的次数(索引-会议室编号,值-次数) int[] count new int[n]; //按顺序处理每一场会议 for(int[] t:m){ long startt[0]; long endt[1]; //释放当前会议开始前已经结束的会议室 //把结束时间当前会议开始时间的会议室放回空闲队列 while(!using.isEmpty()using.peek()[0]start){ //弹出已结束的会议室获取其编号并加入空闲队列 int roomid(int)using.poll()[1]; id.offer(roomid); } int assign;//分配给当前会议的会议室编号 //情况1有空闲会议室 if(!id.isEmpty()) assignid.poll(); //情况2无空闲会议室-等待最早结束的会议室释放 else{ long[] earlyusing.poll();//弹出最早结束的会议室信息 long endtimeearly[0];//该会议室的结束时间 int roomid(int)early[1];//该会议室的编号 //当前会议需要延时开始结束时间也同步延 //延后时长会议室结束时间-当前会议原开始时间 endend(endtime-start); assignroomid;//分配这个刚释放的会议室 } //将当前会议的结束时间和分配的会议室编号加入正在使用的队列 using.offer(new long[]{end,assign}); //该会议室的预定次数1 count[assign]; } //找出预定次数最多的会议室次数相同选编号最小的 int ret0; for(int i0;in;i) if(count[i]count[ret]) reti; return ret; } }