區間問題-掃描線-前綴和-有序區間判重-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;
    }

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM