LeetCode: Process Tasks Using Servers

LeetCode: Process Tasks Using Servers

  1. Process Tasks Using Servers: https://leetcode.com/problems/process-tasks-using-servers/description/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Solution {
public int[] assignTasks(final int[] servers, final int[] tasks) {
if (tasks == null || tasks.length == 0 || servers == null || servers.length == 0) return new int[0];

PriorityQueue<int[]> serverInUser = new PriorityQueue<>((a, b) -> {
int av = a[1] - b[1]; // sort by available time 1st
if (av != 0) return av;
int p = servers[a[0]] - servers[b[0]];
return p == 0 ? a[0] - b[0] : p;
});

PriorityQueue<int[]> freeServer = new PriorityQueue<>((a, b) -> {
int p = servers[a[0]] - servers[b[0]];
return p == 0 ? a[0] - b[0] : p;
});

for (int i = 0; i < servers.length; i++) {
freeServer.add(new int[]{i, 0});
}

int[] result = new int[tasks.length];

for (int i = 0; i < tasks.length; i++) {
int len = tasks[i];

while (!serverInUser.isEmpty() && serverInUser.peek()[1] <= i) {
freeServer.add(serverInUser.poll());
}
int[] s = null;
if (!freeServer.isEmpty()) {
s = freeServer.poll();
s[1] = i + len; // since some server may have available time less than i, we need to use current time `i` as start time
} else {
s = serverInUser.poll();
s[1] += len;
}

serverInUser.add(s);
result[i] = s[0];
}
return result;
}
}