Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b8807e0

Browse files
✨update: Modify 1606
1 parent 1935e56 commit b8807e0

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

‎LeetCode/1601-1610/1606. 找到处理最多请求的服务器(困难).md‎

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ Tag : 「数据结构」、「优先队列」、「堆」、「红黑树」、
8181

8282
再根据「每个任务有对应的开始时间和持续时间」以及「任务分配规则」,容易想到使用优先队列(堆)和有序集合(红黑树)来进行维护。
8383

84-
具体的,利用「每个任务有对应的开始时间和持续时间」,我们使用优先队列(堆)维护二元组 $(idx, endTime),ドル其中 $idx$ 为机器编号,$endTime$ 为当前机台所处理任务的结束时间(也就是该机台最早能够接受新任务的时刻),对于每个 $arrival[i]$ 而言(新任务),我们先从优先队列中取出所有 $endTime < arrival[i]$ 的机台 $idx,ドル加入「空闲池」,然后再按照「任务分配规则」从空闲池子中取机台,若取不到,则丢弃该任务。
84+
具体的,利用「每个任务有对应的开始时间和持续时间」,我们使用优先队列(堆)维护二元组 $(idx, endTime),ドル其中 $idx$ 为机器编号,$endTime$ 为当前机台所处理任务的结束时间(也就是该机台最早能够接受新任务的时刻),对于每个 $arrival[i]$ 而言(新任务),我们先从优先队列中取出所有 $endTime \leqslant arrival[i]$ 的机台 $idx,ドル加入「空闲池」,然后再按照「任务分配规则」从空闲池子中取机台,若取不到,则丢弃该任务。
8585

8686
由于「任务分配规则」是优先取大于等于 `i % k` 的最小值,若取不到,再取大于等于 0ドル$ 的最小值。因此我们的「空闲池」最好是支持「二分」的有序集合,容易想到基于「红黑树」的 `TreeSet` 结构。
8787

@@ -114,6 +114,29 @@ class Solution {
114114
}
115115
}
116116
```
117+
118+
```Python
119+
from sortedcontainers import SortedList
120+
121+
class Solution:
122+
def busiestServers(self, k: int, arrival: List[int], load: List[int]) -> List[int]:
123+
cnts = [0] * k
124+
n, m = len(arrival), 0
125+
busy, free = [], SortedList(range(k))
126+
for i in range(n):
127+
start, end = arrival[i], arrival[i] + load[i]
128+
while busy and busy[0][0] <= start:
129+
free.add(busy[0][1])
130+
heappop(busy)
131+
if (idx := free.bisect_left(i % k)) == len(free) == (idx := free.bisect_left(0)):
132+
continue
133+
u = free[idx]
134+
free.remove(u)
135+
heappush(busy, (end, u))
136+
cnts[u] += 1
137+
m = max(m, cnts[u])
138+
return [i for i in range(k) if cnts[i] == m]
139+
```
117140
* 时间复杂度:令任务数量为 $n,ドル机台数量为 $k,ドル起始将所有机台存入 `TreeSet`,复杂度为 $O(k\log{k})$;每次处理新的 $arrival[i]$ 时,先从优先队列取出可接受新任务的机台,存入 `TreeSet`,然后从 `TreeSet` 中取出最多一个的机台来完成任务,其中从 `TreeSet` 中取出机台最多调用两次的 `ceiling` 操作,复杂度为 $O(\log{k}),ドル这部分的整体复杂度为 $O(n\log{k})$;统计处理任务数达到 `max` 的机台集合复杂度为 $O(k)$;整体复杂度为 $O((k + n)\log{k})$
118141
* 空间复杂度:$O(k)$
119142

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /