-
Notifications
You must be signed in to change notification settings - Fork 119
/
Copy pathProcess Tasks Using Servers.java
59 lines (45 loc) · 1.96 KB
/
Process Tasks Using Servers.java
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Runtime: 421 ms (Top 69.74%) | Memory: 172.7 MB (Top 82.56%)
class Solution {
public int[] assignTasks(int[] servers, int[] tasks) {
PriorityQueue<int[]> availableServer = new PriorityQueue<int[]>((a, b) -> (a[1] != b[1] ? (a[1] - b[1]) : (a[0] - b[0])));
for(int i = 0; i < servers.length; i++){
availableServer.add(new int[]{i, servers[i]});
}
//int[[] arr,
//arr[0] - server index
//arr[1] - server weight
//arr[2] - free time
PriorityQueue<int[]> processingServer = new PriorityQueue<int[]>(
(a, b) ->
(
a[2] != b[2] ? a[2] - b[2] : // try to sort increasing order of free time
a[1] != b[1] ? a[1] - b[1] : // try to sort increasing order of server weight
a[0] - b[0] // sort increasing order of server index
)
);
int[] result = new int[tasks.length];
for(int i = 0; i < tasks.length; i++){
while(!processingServer.isEmpty() && processingServer.peek()[2] <= i){
int serverIndex = processingServer.remove()[0];
availableServer.add(new int[]{serverIndex, servers[serverIndex]});
}
int currentTaskTimeRequired = tasks[i];
int[] server;
//when current task will free the server done
int freeTime = currentTaskTimeRequired;
if(!availableServer.isEmpty()){
server = availableServer.remove();
freeTime += i;
}else{
server = processingServer.remove();
//append previous time
freeTime += server[2];
}
int serverIndex = server[0];
processingServer.add(new int[]{serverIndex, servers[serverIndex] ,freeTime});
//assign this server to current task
result[i] = serverIndex;
}
return result;
}
}