253. 会议室II

253. 会议室 II

难度:中等

给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。

示例 1:

输入:intervals = [[0,30],[5,10],[15,20]]
输出:2

示例 2:

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

提示:

  • 1 <= intervals.length <= 10^4
  • 0 <= start[i] < end[i] <= 10^6

解答:

class Solution {
    //贪心
    //时间复杂度O(NlogN),空间复杂度O(N)
    public int minMeetingRooms(int[][] intervals) {
        if(intervals == null || intervals.length == 0) return 0;
        Arrays.sort(intervals, (o1, o2) -> (o1[0] - o2[0]));
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        for(int[] meeting : intervals){
            if(!heap.isEmpty() && meeting[0] >= heap.peek()) heap.poll();
            heap.add(meeting[1]);
        }
        return heap.size();
    }
}

class Solution {
    //有序化, 上下车问题,不用关心会议的开始时间和结束时间
    //只要有会议开始,而没有会议结束,就添加会议室。
    //如果有会议结束,同时有会议开始,开始时间比会议结束时间晚,不用添加会议室。
    //时间复杂度O(NlogN),空间复杂度O(N)
    public int minMeetingRooms(int[][] intervals){
        int len = intervals.length;
        int[] begin = new int[len];
        int[] end = new int[len];

        for(int i = 0; i < len; i++){
            begin[i] = intervals[i][0];
            end[i] = intervals[i][1];
        }
        Arrays.sort(begin);
        Arrays.sort(end);

        int ans = 0;
        int endIdx = 0;
        for(int beginTime : begin){
            if(beginTime >= end[endIdx]){
                endIdx++;
            }else{
                ans++;
            }
        }
        return ans;
    }
}

参考自:

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/meeting-rooms-ii/solution/hui-yi-shi-ii-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(LeetCode,leetcode,java)