Skip to content

Commit 6de3c70

Browse files
committed
feat: add solutions to lc problem: No.1606
1606.Find Servers That Handled Most Number of Requests
1 parent ce3ba9e commit 6de3c70

File tree

6 files changed

+378
-2
lines changed

6 files changed

+378
-2
lines changed

solution/1600-1699/1606.Find Servers That Handled Most Number of Requests/README.md

+125-1
Original file line numberDiff line numberDiff line change
@@ -85,22 +85,146 @@
8585

8686
<!-- 这里可写通用的实现逻辑 -->
8787

88+
**方法一:有序集合 + 优先队列**
89+
90+
题目求的是最繁忙的服务器列表,因此可以想到用**哈希表**记录每个服务器处理的任务数,然后获取所有处理了最大任务数 mx 的服务器列表即可。关键的问题就在于,求出每个任务分配给了哪台服务器处理。
91+
92+
我们用 有序集合 free 存放所有的空闲服务器,优先队列 busy 存放正在处理请求的服务器的处理结束时间和对应的服务器编号,即二元组 `(end, server)`,优先队列满足队首元素的处理结束时间最小,用一个哈希表 cnt 记录每台服务器处理的任务数。
93+
94+
当第 i 个请求到达时,如果 busy 不为空,我们循环判断 busy 队首的任务结束时间是否小于等于当前请求的到达时间 `arrival[i]`,即 start。如果是,说明队首任务在此时刻已经处理结束,可以从 busy 队列中移出,循环判断。
95+
96+
接下来,如果 free 为空,说明当前没有空闲服务器能够处理第 i 个请求,直接 continue 丢弃;否则,查找 free 中大于等于 `i % k` 的第一个服务器,如果查找成功,那么由该服务器来处理该请求,否则,由 free 的第一个服务器(编号最小)来处理。假设该服务器是 server, 那么 `cnt[server]` 加 1,同时将二元组 `(end, server)` 放入优先队列 busy 中,并且将该 server 中有序集合 free 中移出。
97+
98+
最后,只需要获取 cnt 中的最大值 mx,找出处理了 mx 个任务数的服务器列表,即为答案。
99+
88100
<!-- tabs:start -->
89101

90102
### **Python3**
91103

92104
<!-- 这里可写当前语言的特殊实现逻辑 -->
93105

94106
```python
95-
107+
from sortedcontainers import SortedList
108+
109+
110+
class Solution:
111+
def busiestServers(self, k: int, arrival: List[int], load: List[int]) -> List[int]:
112+
free = SortedList(range(k))
113+
busy = []
114+
cnt = [0] * k
115+
for i, (start, t) in enumerate(zip(arrival, load)):
116+
while busy and busy[0][0] <= start:
117+
free.add(busy[0][1])
118+
heappop(busy)
119+
if not free:
120+
continue
121+
j = free.bisect_left(i % k)
122+
if j == len(free):
123+
j = 0
124+
server = free[j]
125+
cnt[server] += 1
126+
heappush(busy, (start + t, server))
127+
free.remove(server)
128+
129+
mx = max(cnt)
130+
return [i for i, v in enumerate(cnt) if v == mx]
96131
```
97132

98133
### **Java**
99134

100135
<!-- 这里可写当前语言的特殊实现逻辑 -->
101136

102137
```java
138+
class Solution {
139+
public List<Integer> busiestServers(int k, int[] arrival, int[] load) {
140+
int[] cnt = new int[k];
141+
PriorityQueue<int[]> busy = new PriorityQueue<>(Comparator.comparingInt(a -> a[0]));
142+
TreeSet<Integer> free = new TreeSet<>();
143+
for (int i = 0; i < k; ++i) {
144+
free.add(i);
145+
}
146+
for (int i = 0; i < arrival.length; ++i) {
147+
int start = arrival[i];
148+
int end = start + load[i];
149+
while (!busy.isEmpty() && busy.peek()[0] <= start) {
150+
free.add(busy.poll()[1]);
151+
}
152+
if (free.isEmpty()) {
153+
continue;
154+
}
155+
Integer server = free.ceiling(i % k);
156+
if (server == null) {
157+
server = free.first();
158+
}
159+
++cnt[server];
160+
busy.offer(new int[]{end, server});
161+
free.remove(server);
162+
}
163+
int mx = 0;
164+
for (int v : cnt) {
165+
mx = Math.max(mx, v);
166+
}
167+
List<Integer> ans = new ArrayList<>();
168+
for (int i = 0; i < k; ++i) {
169+
if (cnt[i] == mx) {
170+
ans.add(i);
171+
}
172+
}
173+
return ans;
174+
}
175+
}
176+
```
103177

178+
### **Go**
179+
180+
```go
181+
func busiestServers(k int, arrival, load []int) []int {
182+
free := redblacktree.NewWithIntComparator()
183+
for i := 0; i < k; i++ {
184+
free.Put(i, nil)
185+
}
186+
busy := hp{}
187+
cnt := make([]int, k)
188+
for i, t := range arrival {
189+
for len(busy) > 0 && busy[0].end <= t {
190+
free.Put(busy[0].server, nil)
191+
heap.Pop(&busy)
192+
}
193+
if free.Size() == 0 {
194+
continue
195+
}
196+
p, _ := free.Ceiling(i % k)
197+
if p == nil {
198+
p = free.Left()
199+
}
200+
server := p.Key.(int)
201+
cnt[server]++
202+
heap.Push(&busy, pair{t + load[i], server})
203+
free.Remove(server)
204+
}
205+
mx := 0
206+
for _, v := range cnt {
207+
if v > mx {
208+
mx = v
209+
}
210+
}
211+
var ans []int
212+
for i, v := range cnt {
213+
if v == mx {
214+
ans = append(ans, i)
215+
}
216+
}
217+
return ans
218+
}
219+
220+
type pair struct{ end, server int }
221+
type hp []pair
222+
223+
func (h hp) Len() int { return len(h) }
224+
func (h hp) Less(i, j int) bool { return h[i].end < h[j].end }
225+
func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
226+
func (h *hp) Push(v interface{}) { *h = append(*h, v.(pair)) }
227+
func (h *hp) Pop() interface{} { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v }
104228
```
105229

106230
### **...**

solution/1600-1699/1606.Find Servers That Handled Most Number of Requests/README_EN.md

+113-1
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,125 @@ Server 0 handled two requests, while servers 1 and 2 handled one request each. H
6868
### **Python3**
6969

7070
```python
71-
71+
from sortedcontainers import SortedList
72+
73+
74+
class Solution:
75+
def busiestServers(self, k: int, arrival: List[int], load: List[int]) -> List[int]:
76+
free = SortedList(range(k))
77+
busy = []
78+
cnt = [0] * k
79+
for i, (start, t) in enumerate(zip(arrival, load)):
80+
while busy and busy[0][0] <= start:
81+
free.add(busy[0][1])
82+
heappop(busy)
83+
if not free:
84+
continue
85+
j = free.bisect_left(i % k)
86+
if j == len(free):
87+
j = 0
88+
server = free[j]
89+
cnt[server] += 1
90+
heappush(busy, (start + t, server))
91+
free.remove(server)
92+
93+
mx = max(cnt)
94+
return [i for i, v in enumerate(cnt) if v == mx]
7295
```
7396

7497
### **Java**
7598

7699
```java
100+
class Solution {
101+
public List<Integer> busiestServers(int k, int[] arrival, int[] load) {
102+
int[] cnt = new int[k];
103+
PriorityQueue<int[]> busy = new PriorityQueue<>(Comparator.comparingInt(a -> a[0]));
104+
TreeSet<Integer> free = new TreeSet<>();
105+
for (int i = 0; i < k; ++i) {
106+
free.add(i);
107+
}
108+
for (int i = 0; i < arrival.length; ++i) {
109+
int start = arrival[i];
110+
int end = start + load[i];
111+
while (!busy.isEmpty() && busy.peek()[0] <= start) {
112+
free.add(busy.poll()[1]);
113+
}
114+
if (free.isEmpty()) {
115+
continue;
116+
}
117+
Integer server = free.ceiling(i % k);
118+
if (server == null) {
119+
server = free.first();
120+
}
121+
++cnt[server];
122+
busy.offer(new int[]{end, server});
123+
free.remove(server);
124+
}
125+
int mx = 0;
126+
for (int v : cnt) {
127+
mx = Math.max(mx, v);
128+
}
129+
List<Integer> ans = new ArrayList<>();
130+
for (int i = 0; i < k; ++i) {
131+
if (cnt[i] == mx) {
132+
ans.add(i);
133+
}
134+
}
135+
return ans;
136+
}
137+
}
138+
```
77139

140+
### **Go**
141+
142+
```go
143+
func busiestServers(k int, arrival, load []int) []int {
144+
free := redblacktree.NewWithIntComparator()
145+
for i := 0; i < k; i++ {
146+
free.Put(i, nil)
147+
}
148+
busy := hp{}
149+
cnt := make([]int, k)
150+
for i, t := range arrival {
151+
for len(busy) > 0 && busy[0].end <= t {
152+
free.Put(busy[0].server, nil)
153+
heap.Pop(&busy)
154+
}
155+
if free.Size() == 0 {
156+
continue
157+
}
158+
p, _ := free.Ceiling(i % k)
159+
if p == nil {
160+
p = free.Left()
161+
}
162+
server := p.Key.(int)
163+
cnt[server]++
164+
heap.Push(&busy, pair{t + load[i], server})
165+
free.Remove(server)
166+
}
167+
mx := 0
168+
for _, v := range cnt {
169+
if v > mx {
170+
mx = v
171+
}
172+
}
173+
var ans []int
174+
for i, v := range cnt {
175+
if v == mx {
176+
ans = append(ans, i)
177+
}
178+
}
179+
return ans
180+
}
181+
182+
type pair struct{ end, server int }
183+
type hp []pair
184+
185+
func (h hp) Len() int { return len(h) }
186+
func (h hp) Less(i, j int) bool { return h[i].end < h[j].end }
187+
func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
188+
func (h *hp) Push(v interface{}) { *h = append(*h, v.(pair)) }
189+
func (h *hp) Pop() interface{} { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v }
78190
```
79191

80192
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution {
2+
public:
3+
vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {
4+
set<int> free;
5+
for (int i = 0; i < k; ++i) free.insert(i);
6+
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> busy;
7+
vector<int> cnt(k);
8+
for (int i = 0; i < arrival.size(); ++i)
9+
{
10+
int start = arrival[i], end = start + load[i];
11+
while (!busy.empty() && busy.top().first <= start)
12+
{
13+
free.insert(busy.top().second);
14+
busy.pop();
15+
}
16+
if (free.empty()) continue;
17+
auto p = free.lower_bound(i % k);
18+
if (p == free.end()) p = free.begin();
19+
int server = *p;
20+
++cnt[server];
21+
busy.emplace(end, server);
22+
free.erase(server);
23+
}
24+
int mx = *max_element(cnt.begin(), cnt.end());
25+
vector<int> ans;
26+
for (int i = 0; i < k; ++i)
27+
if (cnt[i] == mx)
28+
ans.push_back(i);
29+
return ans;
30+
}
31+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
func busiestServers(k int, arrival, load []int) []int {
2+
free := redblacktree.NewWithIntComparator()
3+
for i := 0; i < k; i++ {
4+
free.Put(i, nil)
5+
}
6+
busy := hp{}
7+
cnt := make([]int, k)
8+
for i, t := range arrival {
9+
for len(busy) > 0 && busy[0].end <= t {
10+
free.Put(busy[0].server, nil)
11+
heap.Pop(&busy)
12+
}
13+
if free.Size() == 0 {
14+
continue
15+
}
16+
p, _ := free.Ceiling(i % k)
17+
if p == nil {
18+
p = free.Left()
19+
}
20+
server := p.Key.(int)
21+
cnt[server]++
22+
heap.Push(&busy, pair{t + load[i], server})
23+
free.Remove(server)
24+
}
25+
mx := 0
26+
for _, v := range cnt {
27+
if v > mx {
28+
mx = v
29+
}
30+
}
31+
var ans []int
32+
for i, v := range cnt {
33+
if v == mx {
34+
ans = append(ans, i)
35+
}
36+
}
37+
return ans
38+
}
39+
40+
type pair struct{ end, server int }
41+
type hp []pair
42+
43+
func (h hp) Len() int { return len(h) }
44+
func (h hp) Less(i, j int) bool { return h[i].end < h[j].end }
45+
func (h hp) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
46+
func (h *hp) Push(v interface{}) { *h = append(*h, v.(pair)) }
47+
func (h *hp) Pop() interface{} { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
class Solution {
2+
public List<Integer> busiestServers(int k, int[] arrival, int[] load) {
3+
int[] cnt = new int[k];
4+
PriorityQueue<int[]> busy = new PriorityQueue<>((a, b) -> a[0] - b[0]);
5+
TreeSet<Integer> free = new TreeSet<>();
6+
for (int i = 0; i < k; ++i) {
7+
free.add(i);
8+
}
9+
for (int i = 0; i < arrival.length; ++i) {
10+
int start = arrival[i];
11+
int end = start + load[i];
12+
while (!busy.isEmpty() && busy.peek()[0] <= start) {
13+
free.add(busy.poll()[1]);
14+
}
15+
if (free.isEmpty()) {
16+
continue;
17+
}
18+
Integer server = free.ceiling(i % k);
19+
if (server == null) {
20+
server = free.first();
21+
}
22+
++cnt[server];
23+
busy.offer(new int[]{end, server});
24+
free.remove(server);
25+
}
26+
int mx = 0;
27+
for (int v : cnt) {
28+
mx = Math.max(mx, v);
29+
}
30+
List<Integer> ans = new ArrayList<>();
31+
for (int i = 0; i < k; ++i) {
32+
if (cnt[i] == mx) {
33+
ans.add(i);
34+
}
35+
}
36+
return ans;
37+
}
38+
}

0 commit comments

Comments
 (0)