# 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; } } ```