Meeting Room

lc252

判读这个人能否参加所有的会议。 skyline problem, 把intervals拆分成点。

/**
 * 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 boolean canAttendMeetings(Interval[] intervals) {
        if(intervals == null || intervals.length == 0) return true;
        Arrays.sort(intervals, new Comparator<Interval>(){
            public int compare(Interval i1, Interval i2){
                return i1.start - i2.start;
            }
        });
        int end = intervals[0].end;
        for(int i = 1; i < intervals.length; i++){
            if(intervals[i].start < end) {
                return false;
            }
            end = Math.max(end, intervals[i].end);
        }
        return true;
    }
}

lc 253 meeting room 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.

time complexity:

o(n) iterate the array, however, we use heap to sort the result, so if should be nlogn. Space 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 {

    class Point{
        int val;
        int flag;
        public Point(int val, int flag){
            this.val = val;
            this.flag = flag;
        }
    }    

    public int minMeetingRooms(Interval[] intervals) {
        if(intervals == null || intervals.length == 0) return 0;
        PriorityQueue<Point> queue = new PriorityQueue<Point>(intervals.length, new Comparator<Point>(){
            public int compare(Point a, Point b){
                if(a.val== b.val){
                    return b.flag - a.flag;
                }
                return a.val - b.val;
            }
        });

        for(int i = 0; i < intervals.length; i++){

            queue.offer(new Point(intervals[i].start, 0));
            queue.offer(new Point(intervals[i].end, 1));            
        }
        int count = 0;
        int res = 0;
        while( !queue.isEmpty()){

            Point cur = queue.poll();
            if(cur.flag == 0){
                count++;
            }else{
                count--;
            }
            if(count > res) {
                res = count;
            }
        }
        return res; 

    }
}

打印所有的room

public class Solution {

    class Point{
        int val;
        int flag;
        Intervals interval;
        public Point(int val, int flag, Intervals interval){
            this.val = val;
            this.flag = flag;
            this.interval = interval;
        }
    }



    public int minMeetingRooms(Interval[] intervals) {
        if(intervals == null || intervals.length == 0) return 0;
        PriorityQueue<Point> queue = new PriorityQueue<Point>(intervals.length, new Comparator<Point>(){
            public int compare(Point a, Point b){
                if(a.val== b.val){
                    return b.flag - a.flag;
                }
                return a.val - b.val;
            }
        });

        int res = 0;
        HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
        HashMap<Intervals, Integer> map2 = new HashMap<Intervals, Integer>();
        ArrayList<Integer> list = new ArrayList<Integer>();
        int index = 1;
        map.put(1, new ArrayList<Integer>());

        for(int i = 0; i < intervals.length; i++){

            queue.offer(new Point(intervals[i].start, 0,intervals[i] ));
            queue.offer(new Point(intervals[i].end, 1,intervals[i]));

        }
        int count = 0;

        while( !queue.isEmpty()){

            Point cur = queue.poll();
            if(cur.flag == 0){
                if(list.size() != 0){
                    int k = list.get(0);
                    list.remove(0);
                    map.get(k).add(cur.interval);
                    map2.put(cur.interval, k);
                    count++;
                }else{
                    map.put(index, new ArrayList<Integer>());
                    map.get(index).add(cur.interval);
                    index++;
                    count++;

                }

            }else{
                int usedIndex = map2.get(cur.interval);
                list.add(usedIndex);
                count--;

            }
            if(count > res) {
                res = count;
            }
        }
        return res;

    }
}

results matching ""

    No results matching ""