Leetcode每日一题 —— 会议室 III

这是一个关于会议室安排的问题。每个会议的开始和结束时间已经确定,我们需要根据给定的规则来安排会议,并找出被使用次数最多的会议室。

思路

按照题目思路,每个会议在哪里举办,什么时候开始已经是确定了的,所以只要按照题目给的规则排列后统计即可。本来是想用TreeSet或者PriorityQueue来获取当前可用的会议室,但是每次都需要提出所有当前可用的会议室才能知道应该用哪个(因为如果都可用的话要取编号最小的那个,而排序是需要先按照会议室可用开始时间优先的)。再看看会议室的范围 1 <= n <= 100,所以不如每次遍历会议室,如果可用就直接用,不可用再选最先结束会议的。

所以最终思路就是,先将会议按开始时间排序,遍历会议,每个会议遍历会议室,找到可用的会议室并计数,最后统计使用最多的会议室。

代码

    public int mostBooked(int n, int meetings) {
        long room = new long[n];
        int useCnt = new int[n];
        Arrays.sort(meetings, Comparator.comparingInt(a -> a[0]));
        for (int meeting : meetings) {
            int start = meeting[0];
            int end = meeting[1];
            int earRoom = -1;
            long earRoomTime = Long.MAX_VALUE;
            for (int i = 0; i < n; i++) {
                if (room[i] <= start) {
                    earRoom = i;
                    earRoomTime = start;
                    break;
                } else {
                    if (room[i] < earRoomTime) {
                        earRoom = i;
                        earRoomTime = room[i];
                    }
                }
            }
            room[earRoom] = earRoomTime + end - start;
            useCnt[earRoom]++;
        }
        int ans = 0, max = 0;
        for (int i = 0; i < n; i++) {
            if (useCnt[i] > max) {
                max = useCnt[i];
                ans = i;
            }
        }
        return ans;
    }

这个代码首先对会议按照开始时间进行排序,然后遍历每个会议,寻找可用的会议室。如果找到可用的会议室,则更新该会议室的结束时间和使用次数。最后,统计使用次数最多的会议室,并返回其编号。

标签: none

评论已关闭