区间问题-扫描线-前缀和-有序区间判重-1897. 会议室 3

2020-04-18 22:21:06

问题描述:

你有一个当前会议列表intervals,里面表明了每个会议的开始和结束时间,以及一些会议室rooms。现在有一系列会议ask需要加入,逐个判断他们能否被安排进当前的会议列表中而不产生冲突。一个会议室在同一时间只能进行一场会议。每个询问都相互独立。

样例

例 1:

输入:Intervals:[[1,2],[4,5],[8,10]],rooms = 1,ask: [[2,3],[3,4]]
输出: [true,true]
解释:
对于[2,3]的询问,我们可以安排一个会议室room0。
以下是room0的会议列表:
[[1,2],[2,3],[4,5],[8,10]]
对于[3,4]的询问,我们可以安排一个会议室room0。
以下是room0的会议列表:
[[1,2],[3,4],[4,5],[8,10]]

例 2:

输入:
[[1,2],[4,5],[8,10]]
1
[[4,5],[5,6]]
输出:
[false,true]

注意事项

保证输入可以被安排在rooms个会议室之中
保证任意一个会议的结束时间不大于50000
|Intervals|<=50000
|ask|<=50000
rooms<=20

问题求解:

非常好的题目,巧妙的将区间判重和最大重叠区间问题结合了起来。

时间复杂度:O(nlogn)

    public boolean[] meetingRoomIII(int[][] intervals, int rooms, int[][] ask) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int[] inte : intervals) {
            map.put(inte[0], map.getOrDefault(inte[0], 0) + 1);
            map.put(inte[1], map.getOrDefault(inte[1], 0) - 1);
        }
        List<int[]> record = new ArrayList<>();
        for (int key : map.keySet()) record.add(new int[]{key, map.get(key)});
        Collections.sort(record, (o1, o2) -> Integer.compare(o1[0], o2[0]));
        List<int[]> pos = new ArrayList<>();
        int presum = 0;
        for (int i = 0; i < record.size(); i++) {
            presum += record.get(i)[1];
            if (presum == rooms) pos.add(new int[]{record.get(i)[0], record.get(i + 1)[0]});
        }
        boolean[] res = new boolean[ask.length];
        if (pos.size() == 0) {
            Arrays.fill(res, true);
            return res;
        }
        for (int i = 0; i < ask.length; i++) {
            int idx = helper(pos, ask[i]);
            if (idx != pos.size() && pos.get(idx)[0] < ask[i][1]) res[i] = false;
            else if (idx != 0 && pos.get(idx - 1)[1] > ask[i][0]) res[i] = false;
            else res[i] = true;
        }
        return res;
    }

  

 

posted @ 2020-04-18 22:24  hyserendipity  阅读(864)  评论(1编辑  收藏  举报