zoukankan      html  css  js  c++  java
  • [LeetCode] 253. Meeting Rooms II 会议室 II

    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:

    /** 
     * Definition for an interval. 
     * public class Interval { 
     *     int start; 
     *     int end; 
     *     Interval() { start = 0; end = 0; } 
     *     Interval(int s, int e) { start = s; end = e; } 
     * } 
     */  
    public class Solution {  
        public int minMeetingRooms(Interval[] intervals) {  
            if(intervals == null || intervals.length == 0) return 0;  
            int min = 0; int max = 0;  
            for(int i=0; i<intervals.length; i++){  
                min = Math.min(min, intervals[i].start);  
                max = Math.max(max, intervals[i].end);  
            }  
              
            int[] count = new int[max-min+1];  
            for(int i=0; i<intervals.length; i++){  
                count[intervals[i].start]++;  
                count[intervals[i].end]--;  
            }  
            int maxroom = Integer.MIN_VALUE;  
            int num = 0;  
            for(int i=0; i<count.length; i++){  
                num += count[i];  
                maxroom = Math.max(maxroom, num);  
            }  
            return maxroom;  
        }  
    }    

    Java:minHeap

    public class Solution { 
       public int minMeetingRooms(Interval[] intervals) {    
         int n=intervals.length;    
         Arrays.sort(intervals, new Comparator<Interval>(){  
             public int compare(Interval a, Interval b) {    
               return a.start-b.start;    
             }  
         });    
         PriorityQueue<Integer> pq=new PriorityQueue<>();    
         for (int i=0; i<n; i++) {    
           if (i>0 && intervals[i].start>=pq.peek()) pq.poll();    
           pq.add(intervals[i].end);    
         }    
         return pq.size();    
       }    
     }      

    Python:

    class Solution:
        # @param {Interval[]} intervals
        # @return {integer}
        def minMeetingRooms(self, intervals):
            starts, ends = [], []
            for i in intervals:
                starts.append(i.start)
                ends.append(i.end)
    
            starts.sort()
            ends.sort()
    
            s, e = 0, 0
            min_rooms, cnt_rooms = 0, 0
            while s < len(starts):
                if starts[s] < ends[e]:
                    cnt_rooms += 1  # Acquire a room.
                    # Update the min number of rooms.
                    min_rooms = max(min_rooms, cnt_rooms)
                    s += 1
                else:
                    cnt_rooms -= 1  # Release a room.
                    e += 1
    
            return min_rooms
    

    C++:

    class Solution {
    public:
        int minMeetingRooms(vector<Interval>& intervals) {
            vector<int> starts, ends;
            for (const auto& i : intervals) {
                starts.emplace_back(i.start);
                ends.emplace_back(i.end);
            }
            
            sort(starts.begin(), starts.end());
            sort(ends.begin(), ends.end());
            
            int min_rooms = 0, cnt_rooms = 0;
            int s = 0, e = 0;
            while (s < starts.size()) {
                if (starts[s] < ends[e]) {
                    ++cnt_rooms;  // Acquire a room.
                    // Update the min number of rooms.
                    min_rooms = max(min_rooms, cnt_rooms);
                    ++s;
                } else {
                    --cnt_rooms;  // Release a room.
                    ++e;
                }
            }
            return min_rooms;
        }
    };
    

    C++: minHeap

    class Solution {
    public:
        int minMeetingRooms(vector<Interval>& intervals) {
            sort(intervals.begin(), intervals.end(), [](const Interval &a, const Interval &b){return a.start < b.start;});
            priority_queue<int, vector<int>, greater<int>> q;
            for (auto a : intervals) {
                if (!q.empty() && q.top() <= a.start) q.pop();
                q.push(a.end);
            }
            return q.size();
        }
    };
    

      

      

    类似题目:

    [LeetCode] 252. Meeting Rooms 会议室

    [LeetCode] 56. Merge Intervals 合并区间

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    Object.defineProperty 监听对象属性变化
    Object.create(null) 和 {} 区别
    Vue 源码 基础知识点
    js setTimeout和setInterval区别
    Fiddler抓包工具使用方法
    使用 Jmeter 做 Web 接口测试
    Python 操作 SQL 数据库 (ORCAL)
    python连接MySQL数据库问题
    抓包工具Charles基本用法
    Python数据分析之pandas学习
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8577794.html
Copyright © 2011-2022 走看看