LeetCode 1606 找到处理最多请求的服务器[模拟 堆] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1606 找到处理最多请求的服务器[模拟 堆] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
写完相当有成就感的一题,虽然题目描述很多,而且标识为困难题,但是如果认真分析一下,合理运用好STL工具,还是轻松解决的。首先分析每个服务器有两种状态,空闲和忙,所以我们可以定义两个容器分别存储空闲和忙的服务器,对于忙的服务器,用堆实现的话可以快速将已经完成任务的服务器取出放入空闲数组中,那么数据结构都定义好后,就是解题步骤的分析了。
- 定义空闲和忙容器,初始化将所有服务器放入空闲数组中。
- 遍历每次请求,首先把忙堆中的空闲服务器取出放入空闲数组中,然后判断空闲数组是否为空,空放弃当前请求,非空,找大于(i%k)的空闲服务器,没有则用下标最小的,并把该服务器放入忙堆中,从空闲数组中删除,同时统计该服务器响应次数。
- 遍历服务器响应次数,记录次数最多的服务器下标并返回。
代码如下:
class Solution
public:
vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load)
int n = arrival.size();
// 定义空闲数组和忙碌服务器堆
set<int> free;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> busy;
vector<int> requests(k), res;
// 初始化空闲数组
for(int i = 0; i < k; i ++)
free.insert(i);
for(int i = 0; i < n; i ++)
// 把当前堆中空闲的服务器取出
while(!busy.empty() && busy.top().first <= arrival[i])
free.insert(busy.top().second);
busy.pop();
// 如果空闲数组为空,丢弃当前请求
if(free.empty())
continue;
// 找大于(i%k)的空闲服务器,没有则用下标最小的
auto pos = free.lower_bound(i % k);
if(pos == free.end())
pos = free.begin();
requests[*pos] ++;
busy.push(arrival[i] + load[i], *pos);
free.erase(*pos);
int maxReq = *max_element(requests.begin(), requests.end());
for(int i = 0; i < k; i ++)
if(requests[i] == maxReq)
res.push_back(i);
return res;
;
以上是关于LeetCode 1606 找到处理最多请求的服务器[模拟 堆] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
JAVA找到处理最多请求的服务器——力扣每日一题(2022.03.30)
JAVA找到处理最多请求的服务器——力扣每日一题(2022.03.30)
JAVA找到处理最多请求的服务器——力扣每日一题(2022.03.30)
JAVA找到处理最多请求的服务器——力扣每日一题(2022.03.30)