Scribbling

[Java] LeetCode: 1606. Find Servers That Handled Most Number of Requests 본문

Computer Science/Java

[Java] LeetCode: 1606. Find Servers That Handled Most Number of Requests

focalpoint 2023. 8. 27. 04:41

https://leetcode.com/problems/find-servers-that-handled-most-number-of-requests/description/

class Solution {
    public List<Integer> busiestServers(int k, int[] arrival, int[] load) {
        int[] counter = new int[k];

        TreeSet<Integer> servers = new TreeSet<>();
        for (int i = 0; i < k; i++) {
            servers.add(i);
        }
        // [endTime, serverId]
        Queue<int []> schedules = new PriorityQueue<>(new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });
        for (int idx = 0; idx < arrival.length; idx ++) {
            int curTime = arrival[idx];
            int endTime = curTime + load[idx];
            while (!schedules.isEmpty() && schedules.peek()[0] <= curTime) {
                int serverId = schedules.poll()[1];
                servers.add(serverId);
            }
            if (servers.size() == 0) {
                continue;
            }
            Integer targetId = servers.ceiling(idx % k);
            if (targetId == null) {
                targetId = servers.first();
            }
            counter[targetId]++;
            servers.remove(targetId);
            schedules.offer(new int[] {endTime, targetId});
        }

        List<Integer> arr = Arrays.stream(counter).boxed().collect(Collectors.toList());
        int max = Collections.max(arr);
        List<Integer> ret = new ArrayList<>();
        for (int i = 0; i < counter.length; i++) {
            if (counter[i] == max) {
                ret.add(i);
            }
        }
        return ret;
    }
}