LeetCode 1606. 找到处理最多请求服务器

LeetCode 1606. 找到处理最多请求服务器

在这里插入图片描述

保姆级官方题解注释(转自LeetCode官方题解,注释为博主理解)

**将空闲服务器的编号都放入一个有序集合 available 中,将正在处理请求的服务器的处理结束时间和编号都放入一个优先队列busy 中,优先队列满足队首的服务器的处理结束时间最小,用一个数组 requests 记录对应服务器处理的请求数目。

假设当前到达的请求为第 i 个,如果 busy 不为空, 那么我们判断 busy 的队首对应的服务器的结束时间是否小于等于当前请求的到达时间 arrival[i],如果是,那么我们将它从 busy 中移除,并且将该服务器的编号放入 available 中,然后再次进行判断。如果 available 为空,那么该请求被丢弃;否则查找 available 中大于等于 i mod k 的第一个元素,如果查找成功,那么将它作为处理请求的服务器,否则将 available 中编号最小的服务器作为处理请求的服务器。设处理请求的服务器的编号为 j ,那么将 requests[j]1,并且将该服务器从available 移除,然后将服务器 j 放入 busy 中,对应的处理结束时间为 arrival[i]+load[i]。

获取requests 的最大值 maxRequest,遍历requests 数组,对于每个下标 i,如果requests[i]=maxRequest,那么将编号 i 加入结果中。

class Solution {
public:
    vector<int> busiestServers(int k, vector<int> &arrival, vector<int> &load) {
        set<int> available;//空闲可用服务器
        for (int i = 0; i < k; i++) {
            available.insert(i);
        }//初始化全空闲服务器
        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> busy;//由小到大的队列
        //这里busy的初始化 参考优先队列的声明 priority_queue<TYPE,Container,Functional>
        //busy的元素内容由pair<int, int>决定
        vector<int> requests(k); //记录每个服务器的请求次数
        for (int i = 0; i < arrival.size(); i++) { //对于每一个请求的开始时间loop
            while (!busy.empty() && busy.top().first <= arrival[i]) {//使用while而不是if是可能有多个busy中的任务在这次请求时间完成。
                available.insert(busy.top().second);
                busy.pop();
            } //当前任务的开始时间 大于等于目前busy队列中最早结束的任务,更新available,busy
            if (available.empty()) {
                continue;
            }//可用服务器空,按题意不处理此请求 drop
            //能否找到第一个大于等于 i % k 的服务器 ,之前已经判断服务器不为空,肯定有空闲服务器
            auto p = available.lower_bound(i % k);//能否找到一个大于等于 i % k 的服务器 
            if (p == available.end()) {
                p = available.begin();//根据set有唯一排序的特性,没有找到 p 时,取从0开始的最小的空闲服务器
            }
            requests[*p]++; //请求数+1
            busy.emplace(arrival[i] + load[i], *p); //把当前执行的放入busy
            available.erase(p); //可用服务器 p 已经被分配,移除
        }
        int maxRequest = *max_element(requests.begin(), requests.end()); //一步取得vector中的的最大值
        vector<int> ret;
        for (int i = 0; i < k; i++) {//返回满足条件的所有服务器标号
            if (requests[i] == maxRequest) {
                ret.push_back(i);
            }
        }
        return ret;
    }
};


觉得文章有用,点个赞,点个收藏,支持一下

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BiuPsYao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值