一刷185-力扣热题-253会议室II(m)

题目:
给定一个会议时间安排的数组,
每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],] (si < ei),
为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。
示例:
输入: [[0, 30],[5, 10],[15, 20]]
输出: 2

输入: [[7,10],[2,4]]
输出: 1

思考:
这个题目有点类似于上下车问题。本题是规划的对于时间冲突的解决方案。
根据题目,我们发现,并不需要在意该会议持续时间。因为会议时间已经固定了,
所以我们只需要关注会议室及其会议结束时间即可。
因为只有会议时间结束,才能进行下一个会议。否则,这需要开一个新的会议室,去进行会议。
为了最优开会成本和时间效率,下一个会议进入的房间,根据会议室结束时间和该会议开始时间的差决定,
时间差越小,开会越能“无缝连接”,于是效率越高。

用优先队列实现最小堆

先将数组进行升序排序
 Arrays.sort(intervals,(o1,o2)->o1[0]-o2[0]);

这里使用了Lambda表达式,完整写法应该是
Arrays.sort(intervals,new Comparator<int[]>(){
	@Override
	public int compare(int[]o1,int[]o2){
		return o1[0]-o2[0];
	}
});
o1[0]-o2[0] <=0,且o1排在o2前面,所以是升序排序。

将会议的结束时间存入优先队列(升序排序),队首元素为最早会议结束时间(start),
如果另一场会议的开始时间早于start,则没有空闲会议室,需要新开一间;否则,弹出队首元素。

最后队列中的剩余元素为会议室数量

时间复杂度:
排序:O(NlogN);插入和删除:O(logN)
所以总的时间复杂度为O(NlogN)
空间复杂度: O(N)
class Solution {
	public int minMeetingRooms(int[][] intervals) {
		if (intervals == null || intervals.length == 0) return 0;
		Arrays.sort(intervals, (o1, o2) - > o1[0] - o2[0]);//升序排列
		PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> o1-o2);
		queue.offer(intervals[0][1]);//将第一个会议的结束时间存入栈中
		for (int i = 1; i < intervals.length; i++) {//从第二个会议开始遍历
			//若之后的会议开始时间 大于 当前栈中栈顶存储的结束时间 
			//(大于: 会议开始时间 在 栈顶时间之后)  
			//弹栈:代表 这个会议室可以重复使用, 不需要重新开新的一间会议室 所以queue--
			if (intervals[i][0] >= queue.peek()) {
				queue.poll();
			}
			queue.offer(intervals[i][1]); 
		}
		return queue.size();
	}
}

(plus题目)

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值