253. 会议室 II———使用优先队列或者拆分的方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/m1f2c3/article/details/100139591

力扣官方题解
https://leetcode-cn.com/problems/meeting-rooms-ii/solution/hui-yi-shi-ii-by-leetcode/

给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
    public int minMeetingRooms(int[][] intervals) {
        if(intervals.length == 0) return 0;
        in[] mem = new in[intervals.length];
        for(int i = 0; i < intervals.length; ++i){
            mem[i] = new in(intervals[i][0], intervals[i][1]);
        }

        Arrays.sort(mem, new Comparator<in>() {
            @Override
            public int compare(in o1, in o2) {
                return o1.b - o2.b;
            }
        });
        int max = 1;
        for(int i = mem.length - 1; i > 0; --i){
            int mem_sum = 1;
            for(int j = i - 1; j >= 0; --j){
                if(mem[i].b < mem[j].e){
                    ++mem_sum;
                }
            }
            if(mem_sum > max){
                max = mem_sum;
            }
        }
        return max;
    }
}

class in{
    public int b = 0;
    public int e = 0;
    public in(){

    }
    public in(int b, int e){
        this.b = b;
        this.e = e;
    }
}

大神给的方法,利用了优先队列

class Solution {
    public int minMeetingRooms(int[][] intervals) {
        if(intervals.length == 0) return 0;
        Arrays.sort(intervals,Comparator.comparingInt(o->o[0]));
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        int rooms = 0;
        for(int i=0; i<intervals.length; i++) {
            minHeap.offer(intervals[i][1]);
            if (intervals[i][0] < minHeap.peek()) {
                rooms ++;
            } else {
                minHeap.poll();
            }
        }
        return rooms;
    }
}

作者:18520397110
链接:https://leetcode-cn.com/problems/meeting-rooms-ii/solution/tan-xin-suan-fa-you-xian-dui-lie-shi-xian-tong-guo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

除了用优先队列,还可用将会议的开始时间和结束时间分开比较。优先队列和这种方法都在力扣的官方解答里详细阐明了

class Solution {
    public int minMeetingRooms(int[][] intervals) {
        if(intervals.length == 0) return 0;
        int[] starts = new int[intervals.length];
        int[] ends = new int[intervals.length];
        for(int i = 0; i < starts.length; ++i) starts[i] = intervals[i][0];
        for(int i = 0; i < ends.length; ++i) ends[i] = intervals[i][1];
        int index_start = 0;
        int index_end = 0;
        int sum = 0;
        Arrays.sort(starts);
        Arrays.sort(ends);
        while(index_start < intervals.length && index_end < intervals.length){
            if(starts[index_start] >= ends[index_end]){
                index_end++;
            }else{
                ++sum;
            }
            ++index_start;
        }
        return sum;
    }
}

猜你喜欢

转载自blog.csdn.net/m1f2c3/article/details/100139591