LeetCode探索(堆和贪心)

会议室2

题目地址:https://leetcode-cn.com/problems/meeting-rooms-ii/
题目大意:
给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],…] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。
示例 1:

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

示例 2:

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

分析

刚看到这道题的时候感觉无从下手,看到标签是堆和栈,下意识的想用单调栈。
但是又想起上次合并区间的题目,觉得应该是贪心算法。
和上次的题目一样,我们首先排序。
其实对于后一个会议来说,并不关心前面的会议室是什么时候开始的,只关心是什么时候结束的。这样一来我们需要返回的就是结束时间的最小值,使用完这个最小值之后就不能再次使用了,也就说要取出这个最小值。
所以想到了什么数据结构?答案是小顶堆。
每次加入一个会议的时候,我们查看堆顶元素的结束时间是否小于该会议的开始时间,如果是则取出堆顶元素,然后加入新的会议。如果不是,则直接加入。
最后让我们再来背一下Java中堆是怎么实现的?PriorityQueue,默认是小顶堆,如果要自定义排序可以使用lambda表达式输入排序函数,由在前面的值减去在后面的值。

class Solution {
    public int minMeetingRooms(int[][] intervals){
        if(intervals == null || intervals.length == 0)
            return 0;
        //先排序!先排序!先排序!
        Arrays.sort(intervals,(a,b)->(a[0]-b[0]));
        //由于存放的是int[]所以不能直接比较,记得重写cmp函数
        PriorityQueue<int[]> heap = new PriorityQueue<>((a,b)->(a[1]-b[1]));
        for(int[] meet:intervals){
            if(!heap.isEmpty()){
                if(heap.peek()[1] <= meet[0]){
                    heap.poll();
                }
            }
            heap.add(meet);
        }
        return heap.size();
    }
}

更加优秀的解法

在上面一小节中我们已经了解了其实对于后一个会议来说,他并不关心前一个会议什么时候开始。
那么我们可以将会议开始时间和会议结束时间拆分开并且排序,然后遍历会议开始时间,如果会议开始时间小于当前最小的结束时间,说明可以共用一个会议室。
具体分析过程请看力扣的官方题解,我就不班门弄斧了。

class Solution {
    public int minMeetingRooms(int[][] intervals){
        if(intervals == null || intervals.length == 0)
            return 0;
        int[] starts = new int[intervals.length];
        int[] ends = new int[intervals.length];
        for(int i=0;i<intervals.length;i++){
            starts[i] = intervals[i][0];
            ends[i] = intervals[i][1];
        }
        Arrays.sort(starts);
        Arrays.sort(ends);
        int index = 0;
        int startIndex = 0;
        int endIndex = 0;
        int count = 0;
        while(index++<intervals.length){
            if(starts[startIndex] >= ends[endIndex]){
                count--;
                endIndex++;
            }
            startIndex++;
            count++;
        }
        return count;
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_33241802/article/details/106939760