Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si < ei), find the minimum number of conference rooms required.

For example,
Given [[0, 30],[5, 10],[15, 20]],
return 2.

252. Meeting Rooms 的拓展,同样给一个开会的区间数组,返回最少需要的房间数。

解法1: 把区间变成2个数组:start时间数组和end时间数组,并对两个数组排序。然后一个指针遍历start数组,另一个指针指向end数组。如果start时间小于end时间,房间数就加1,start时间加1,比较并记录出现过的最多房间数。start时间大于end,则所需房间数就减1,end指针加1。

解法2:最小堆minHeap,先按start排序,然后维护一个minHeap,堆顶元素是会议结束时间最早的区间,也就是end最小。每次比较top元素的end时间和当前元素的start时间,如果end < start,说明该room可以结束接下来被当前会议区间使用。最后返回堆的大小就是所需的房间数。

面试follow up: 结果要将会议名称跟对应房间号一起返回,而不仅仅是算需要的房间数目。

Java:

  1. /**
  2. * Definition for an interval.
  3. * public class Interval {
  4. * int start;
  5. * int end;
  6. * Interval() { start = 0; end = 0; }
  7. * Interval(int s, int e) { start = s; end = e; }
  8. * }
  9. */
  10. public class Solution {
  11. public int minMeetingRooms(Interval[] intervals) {
  12. if(intervals == null || intervals.length == 0) return 0;
  13. int min = 0; int max = 0;
  14. for(int i=0; i<intervals.length; i++){
  15. min = Math.min(min, intervals[i].start);
  16. max = Math.max(max, intervals[i].end);
  17. }
  18.  
  19. int[] count = new int[max-min+1];
  20. for(int i=0; i<intervals.length; i++){
  21. count[intervals[i].start]++;
  22. count[intervals[i].end]--;
  23. }
  24. int maxroom = Integer.MIN_VALUE;
  25. int num = 0;
  26. for(int i=0; i<count.length; i++){
  27. num += count[i];
  28. maxroom = Math.max(maxroom, num);
  29. }
  30. return maxroom;
  31. }
  32. }   

Java:minHeap

  1. public class Solution {
  2. public int minMeetingRooms(Interval[] intervals) {
  3. int n=intervals.length;
  4. Arrays.sort(intervals, new Comparator<Interval>(){
  5. public int compare(Interval a, Interval b) {
  6. return a.start-b.start;
  7. }
  8. });
  9. PriorityQueue<Integer> pq=new PriorityQueue<>();
  10. for (int i=0; i<n; i++) {
  11. if (i>0 && intervals[i].start>=pq.peek()) pq.poll();
  12. pq.add(intervals[i].end);
  13. }
  14. return pq.size();
  15. }
  16. }   

Python:

  1. class Solution:
  2. # @param {Interval[]} intervals
  3. # @return {integer}
  4. def minMeetingRooms(self, intervals):
  5. starts, ends = [], []
  6. for i in intervals:
  7. starts.append(i.start)
  8. ends.append(i.end)
  9.  
  10. starts.sort()
  11. ends.sort()
  12.  
  13. s, e = 0, 0
  14. min_rooms, cnt_rooms = 0, 0
  15. while s < len(starts):
  16. if starts[s] < ends[e]:
  17. cnt_rooms += 1 # Acquire a room.
  18. # Update the min number of rooms.
  19. min_rooms = max(min_rooms, cnt_rooms)
  20. s += 1
  21. else:
  22. cnt_rooms -= 1 # Release a room.
  23. e += 1
  24.  
  25. return min_rooms

C++:

  1. class Solution {
  2. public:
  3. int minMeetingRooms(vector<Interval>& intervals) {
  4. vector<int> starts, ends;
  5. for (const auto& i : intervals) {
  6. starts.emplace_back(i.start);
  7. ends.emplace_back(i.end);
  8. }
  9.  
  10. sort(starts.begin(), starts.end());
  11. sort(ends.begin(), ends.end());
  12.  
  13. int min_rooms = 0, cnt_rooms = 0;
  14. int s = 0, e = 0;
  15. while (s < starts.size()) {
  16. if (starts[s] < ends[e]) {
  17. ++cnt_rooms; // Acquire a room.
  18. // Update the min number of rooms.
  19. min_rooms = max(min_rooms, cnt_rooms);
  20. ++s;
  21. } else {
  22. --cnt_rooms; // Release a room.
  23. ++e;
  24. }
  25. }
  26. return min_rooms;
  27. }
  28. };

C++: minHeap

  1. class Solution {
  2. public:
  3. int minMeetingRooms(vector<Interval>& intervals) {
  4. sort(intervals.begin(), intervals.end(), [](const Interval &a, const Interval &b){return a.start < b.start;});
  5. priority_queue<int, vector<int>, greater<int>> q;
  6. for (auto a : intervals) {
  7. if (!q.empty() && q.top() <= a.start) q.pop();
  8. q.push(a.end);
  9. }
  10. return q.size();
  11. }
  12. };

  

  

类似题目:

[LeetCode] 252. Meeting Rooms 会议室

[LeetCode] 56. Merge Intervals 合并区间

All LeetCode Questions List 题目汇总

[LeetCode] 253. Meeting Rooms II 会议室 II的更多相关文章

  1. [LeetCode] 253. Meeting Rooms II 会议室之二

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...

  2. [leetcode]253. Meeting Rooms II 会议室II

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...

  3. [LeetCode#253] Meeting Rooms II

    Problem: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2] ...

  4. LeetCode 252. Meeting Rooms (会议室)$

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...

  5. 252. Meeting Rooms 区间会议室

    [抄题]: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],.. ...

  6. [LeetCode] 252. Meeting Rooms 会议室

    Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...

  7. 【LeetCode】253. Meeting Rooms II 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 排序+堆 日期 题目地址:https://leetco ...

  8. 253. Meeting Rooms II 需要多少间会议室

    [抄题]: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],.. ...

  9. 253. Meeting Rooms II

    题目: Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] ...

随机推荐

  1. Four subspaces - Prof. Strang

    相应地,用映射的观点考察映射σ的kernal space与image space,得到的就是下面这张图啦 Ref: Introduction to Linear Algebra 5th Edition ...

  2. 洛谷 P2722 总分题解

    题目描述 我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数.你的任务是写一个程序来告诉USACO的 ...

  3. Electrification Plan 最小生成树(prim+krusl+堆优化prim)

    题目 题意: 无向图,给n个城市,n*n条边,每条边都有一个权值 代表修路的代价,其中有k个点有发电站,给出这k个点的编号,要每一个城市都连到发电站,问最小的修路代价. 思路: prim:把发电站之间 ...

  4. PHP中的分支及循环语句

    这次实践的都是PHP7的语法. 感觉是以前的5差别不是那么大,只是希望越来越快吧. <?php $looking = isset($_GET['title']) || isset($_GET[' ...

  5. python学习类与方法的调用规则

    1类方法的特点是类方法不属于任何该类的对象,只属于类本身 2类的静态方法类似于全局函数,因为静态方法既没有实例方法的self参数也没有类方法的cls参数,谁都可以调用 3.实例方法只属于实例,是实例化 ...

  6. Linux学习21-设置定时任务crontab

    前言 做自动化测试写的脚本需设置定时任务,在指定的时间去执行,这就需要用到定时任务.之前用jenkins可以在里面设置定时任务,很好用,其实不用jenkins,在linux上也可以用crontab做个 ...

  7. Django REST framework 使用简记

    最近在参与的项目中需要使用到dajngo REST framework工具包进行开发,之前参与的项目几乎都是清一色的使用原生的django(话说偶尔也会使用一下Flask,真心不怎么喜欢这个框架),之 ...

  8. spring jar包的作用

    spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-m ...

  9. 66、Spark Streaming:数据处理原理剖析与源码分析(block与batch关系透彻解析)

    一.数据处理原理剖析 每隔我们设置的batch interval 的time,就去找ReceiverTracker,将其中的,从上次划分batch的时间,到目前为止的这个batch interval ...

  10. Go-Json操作

    /** * @Author: jadeshu * @Description: * @File: main * @Version: 1.0.0 * @Date: 2019/11/7 2:33 */ pa ...