Meeting Rooms II

来源:互联网 发布:mac免费视频剪辑软件 编辑:程序博客网 时间:2024/05/17 06:02

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.

思路:就是跟我电面的题目很相似,就是开始+1,结束-1,首先找到最大值最小值,然后申请数组空间,记录所有信息,然后扫一遍,num用来记录这个序列的值,然后maxroom保存住其中的最大值即可。我看到网上用heap的算法,我觉得应该没有这个方便吧,这个是O(n)的算法。而且这个算法把头跟尾是一个时间也包含了。O(n)

/** * 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;    }}

方法2:用pq来做,首先将interval按照start point来sort一遍,然后用priorityqueue来维护一个最小堆,用来保存所有meeting的end值,如果新比较的meeting的start > pq.peek(),则证明之前的会议已经开完,那么可以用之前的会议室,那么pq poll 之前的end,也就是说,pq里面维护的是那些具有重复性质overlap的会议的end值。最后pq的size就是不能够解决的会议,是重复开的会议的个数。O(nlogn)

/** * 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;        Arrays.sort(intervals, new Comparator<Interval>(){           @Override           public int compare(Interval a, Interval b){               return (a.start - b.start);           }        });                PriorityQueue<Integer> pq = new PriorityQueue<Integer>();        pq.add(intervals[0].end);        for(int i=1; i<intervals.length; i++){            if(intervals[i].start >= pq.peek()){                pq.poll();            }            pq.add(intervals[i].end);        }        return pq.size();    }}


0 0
原创粉丝点击