---
# System prepended metadata

title: 2402. Meeting Rooms III
tags: [LeetCode -Hard]

---

# 2402. Meeting Rooms III

> ***View the book with <i class="fa fa-book"></i> Book Mode.***

- [**LeetCode筆記目錄**](https://hackmd.io/@WeiYee/SyABdj_eA)

## :book: 題目

**網址:**  https://leetcode.com/problems/meeting-rooms-iii/description/

## :dart: 解題步驟
- 因為 meetings 沒有排列順序，且會議開始時間不會重複，所以先找出最晚的會議開始時間，並整理成一個 array 紀錄。
- 接著就是從 0 到 最晚的會議開始時間跑一輪，我們會需要
    - 二維 array 來存取紀錄，room[n][0] 代表n號房被使用的次數，room[n][1] 代表n號房在何時沒有會議，可以被借用。
    - 變數 currTime，來記錄當前時間，因為可能會發生當下沒有空於會議室，需要延後的狀況。 另外，要注意當這種狀況發生的時候，可能會造成 room[n][1] 在紀錄的時候溢位。

## :pencil2: 程式碼
### Java
```java=
class Solution {
    public int mostBooked(int n, int[][] meetings) {

        int startTimeMax = 0, i, currTime = 0, maxValue = Integer.MAX_VALUE - 500000;
        int[][] room = new int[n][2];
        for (i = 0; i < meetings.length; ++i) if (meetings[i][0] > startTimeMax) startTimeMax = meetings[i][0];

        int[] scheduleTime = new int[startTimeMax + 1];
        for (i = 0; i < meetings.length; ++i) scheduleTime[meetings[i][0]] = meetings[i][1];

        for (i = 0; i <= startTimeMax; ++i) {
            if (scheduleTime[i] == 0) continue;
            if (currTime < i) currTime = i;

            int selectRoomNo = 0;
            for (int j = 1; j < n; ++j) {
                if (currTime >= room[selectRoomNo][1]) break;
                else if (room[selectRoomNo][1] > room[j][1]) selectRoomNo = j;
            }

            if (currTime > maxValue) {
                int target = room[selectRoomNo][1];
                for (int j = 0; j < n; ++j) room[j][1] -= target;
                currTime = i;
            } else if (currTime < room[selectRoomNo][1]) currTime = room[selectRoomNo][1];
            room[selectRoomNo][1] = currTime + scheduleTime[i] - i;
            ++room[selectRoomNo][0];
        }

        int ans = 0;
        for (i = 0; i < n; ++i) if (room[i][0] > room[ans][0]) ans = i;
        return ans;
    }
}
```

