[Leetcode]253. 会议室 II(数组/堆)
题目
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],...] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。
示例 1:
输入: [[0, 30],[5, 10],[15, 20]]
输出: 2
示例 2:
输入: [[7,10],[2,4]]
输出: 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/meeting-rooms-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
这道题的重点是可以抛弃到开始时间和结束时间的对应关系,因为它没用
方法一:指针
1 开两个一维数组,分别存放开始时间、结束时间。
2 数组排序。
3 两个数组分别维护一个指针,均初始化为第一个位置,然后按时间顺序右移指针。
4 维护房间数roomCnt=begIdx+1-endIdx,它的最大值即为所求。
方法二:堆
1 用最小堆堆存结束时间,堆顶元素即为最快结束的房间。
2 按开始时间排序会议,遍历数组,每次比较该元组结束时间和堆顶元素,若堆顶元素即结束时间大于该起始时间,则将结束时间加入堆,若小于则更新堆顶元素
3 最终堆的size即为所求
代码
方法一
class Solution {
public int minMeetingRooms(int[][] intervals) {
if(intervals==null||intervals.length==0){
return 0;
}
int len=intervals.length;//
int[] end=new int[len];
int[] beg=new int[len];
for(int i=0;i<intervals.length;++i){
end[i]=intervals[i][1];
beg[i]=intervals[i][0];
}
Arrays.sort(end);
Arrays.sort(beg);
int idxBeg=0;
int idxEnd=0;
int maxRoomCnt=0;
int roomCnt=0;
while(idxBeg<len&&idxEnd<len){//
roomCnt=idxBeg+1-idxEnd;
maxRoomCnt=roomCnt>maxRoomCnt?roomCnt:maxRoomCnt;
if(idxBeg!=len-1&&beg[idxBeg+1]<end[idxEnd]){//
idxBeg++;
}else{
idxEnd++;
}
}
return maxRoomCnt;
}
}
posted on 2020-11-03 22:55 coding_gaga 阅读(857) 评论(0) 编辑 收藏 举报
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 《HelloGitHub》第 108 期
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具
2019-11-03 [LeetCode]23. 合并K个排序链表(优先队列;分治待做)
2019-11-03 [LeetCode]142. 环形链表 II