LeetCode-1606. 找到处理最多请求的服务器、C++中优先队列的使用

2023-11-10

你有 k 个服务器,编号为 0 到 k-1 ,它们可以同时处理多个请求组。每个服务器有无穷的计算能力但是 不能同时处理超过一个请求 。请求分配到服务器的规则如下:
第 i (序号从 0 开始)个请求到达。
如果所有服务器都已被占据,那么该请求被舍弃(完全不处理)。
如果第 (i % k) 个服务器空闲,那么对应服务器会处理该请求。
否则,将请求安排给下一个空闲的服务器(服务器构成一个环,必要的话可能从第 0 个服务器开始继续找下一个空闲的服务器)。比方说,如果第 i 个服务器在忙,那么会查看第 (i+1) 个服务器,第 (i+2) 个服务器等等。
给你一个 严格递增 的正整数数组 arrival ,表示第 i 个任务的到达时间,和另一个数组 load ,其中 load[i] 表示第 i 个请求的工作量(也就是服务器完成它所需要的时间)。你的任务是找到 最繁忙的服务器 。最繁忙定义为一个服务器处理的请求数是所有服务器里最多的。
请你返回包含所有 最繁忙服务器 序号的列表,你可以以任意顺序返回这个列表
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-servers-that-handled-most-number-of-requests

题目分析

综合使用 STL 中的一些数据结构及算法来解决本题,主要涉及的知识点如下:
①.set:有序集合,元素不重复,默认升序
②.pair:包含 first 和 second 两个元素的结构体,排序先比较 first、再比较 second
③.priority_queue:优先队列,默认降序排序,即最大值排第一个
④.lower_bound:采用二分查找,查找第一个大于等于目标值的元素,返回其迭代器
⑤.max_element:返回指定范围中最大值的迭代器

详细解题过程见代码及注释

代码示例

class Solution {
public:
    vector<int> busiestServers(int k, vector<int>& arrival, vector<int>& load) {

        set<int> canUseServer;//当前可用的服务器列表,按编号排序
        for( int i = 0;i < k;++i ) canUseServer.insert(i);//初始全部服务器可用

        priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> workServer;
        //工作中的服务器,按工作结束时间排序 :<工作结束时间,服务器编号>

        vector<int> requests(k);//每个服务器处理的任务数

        auto doTask = [&](int taskNum){//处理第 taskNum 项任务
            //查找在任务到来之前以及结束工作的服务器    
            while (!workServer.empty() && workServer.top().first <= arrival[taskNum]) {
                canUseServer.insert(workServer.top().second);//加入到可用服务器
                workServer.pop();//工作服务器中移除
            }
            if( canUseServer.empty()) return;//没有可用服务器,跳过该任务

            auto iter = canUseServer.lower_bound(taskNum % k); //查找对应服务器:第一个 >= taskNum % k
            if (iter == canUseServer.end()) iter = canUseServer.begin();//没找到则返回开头一个可用的服务器
            requests[*iter]++;//对应服务器处理任务数+1

            workServer.emplace(arrival[taskNum] + load[taskNum], *iter);//添加到工作队列
            canUseServer.erase(iter);//可用服务器中删除

        };

        for (int i = 0; i < arrival.size(); i++) 
        {    
            doTask(i);//执行每一项任务
        }

        int maxCount = *max_element(requests.begin(), requests.end());//找到最大的执行任务数
        vector<int> result;
        for (int i = 0; i < k; i++) {
            if (requests[i] == maxCount) {//找到所有等于最大任务数的服务器
                result.push_back(i);
            }
        }
        return result;


    }
    
};


在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode-1606. 找到处理最多请求的服务器、C++中优先队列的使用 的相关文章

随机推荐

  • Jenkins

    Jenkins jenkins定义 jenkins功能 tomcat项目部署 jenkins安装 安装后的jenkins的配置 Jenkins jenkins定义 jenkins tomcat 部署 安装 jenkins 是一个开源软件项目
  • 栈的概念和基本使用

    栈 Stack 是一种线性序列结构 其操作仅限于逻辑上特定的一端 即新元素只能从栈的一端插入 也只能从栈的一端弹出 允许操作的一端叫做栈顶 禁止操作的一端叫做栈底 插入元素称为入栈 弹出元素称为出栈 栈中各个元素的操作次序遵循所谓的后进先出
  • 涅普2021训练营-MIsc(部分)

    bin txt 打开附件发现是一大串的二进制字符串 使用python直接转换成16进制 最好别用网页转换 字符串太长了 也不需要创建什么函数 直接进制转换 参考格式 hex int 字符串 2 将得到的16进制吗复制到文本 将0x删除后复制
  • git 服务端钩子做代码检查

    需求分析 在代码修改后可以对代码进行检查 比如代码规范检查 代码构建 单元测试等 我们需要禁止成员推送不符合规范的代码到服务端 Git 钩子能在特定的重要动作发生时触发自定义脚本 钩子分为客户端和服务器端两类 使用客服端钩子可以在commi
  • 字符游戏-智能蛇

    字符游戏 智能蛇 一 VT 100 终端标准 这里按照老师的课件要求 体验一下VT 100 输入输出功能以及清屏操作 代码直接复制课件中代码 这里就不再放一次了 直接给出运行效果 gcc sin demo c osin out lm sin
  • OpenAI开发系列(一):一文搞懂大模型、GPT、ChatGPT等AI概念

    全文共5000余字 预计阅读时间约10 20分钟 满满干货 建议收藏 本文目标 详细解释大型语言模型 LLM 和OpenAI的GPT系列的基本概念 一 什么是大模型 大型语言模型 也称大语言模型 大模型 Large Language Mod
  • 解决Centos7没有ens33

    进入centos7操作 ifconfig ens33 up systemctl stop NetworkManager systemctl disable NetworkManager ifup ens33 systemctl restar
  • explain查看索引使用

    CREATE TABLE test id int 11 NOT NULL name varchar 20 DEFAULT NULL dep id int 11 DEFAULT NULL age int 11 DEFAULT NULL tt
  • Qt中正确引用外部头文件和库文件的方法和注意点

    Qt中正确引入外部库文件的方法和注意点 一 什么报错是外部库导入错误导致的 二 解决外部库使用的方法 一 写入系统环境变量中的外部库调用 1 解释说明 2 使用演示 1 头文件 2 库文件 二 未写入系统环境变量中的外部库调用 1 解释说明
  • controller层

    前言 controller层代码主要流程都是 1 获取前端数据 运用request getParameter 数据名 2 创建user对象 用来传递参数 创建Service对象 用来使用Service服务的方法 3 调用Service的方法
  • C++11内存对齐之std::aligned_storage与alignas与alignof

    1 std aligned storage 插播一下POD的含义 Plain old data structure 缩写为POD 是C 语言的标准中定义的一类数据结构 POD适用于需要明确的数据底层操作的系统中 POD通常被用在系统的边界处
  • DateTime转换为时间戳

  • 记一次线性插值方法(Mathf.Lerp())的使用体会

    对Mathf Lerp 方法使用体会源于一次开发游戏对警报灯闪烁问题进行处理时 public static float Lerp float from float to float t 分析一下对线性插值函数的认识 就是在from与to之间
  • 看完这篇文章保你面试稳操胜券——小程序篇

    进大厂收藏这一系列就够了 全方位搜集总结 为大家归纳出这篇面试宝典 面试途中祝你一臂之力 共分为四个系列 本 篇 为 看 完 这 篇 文 章 保 你 面 试 稳 操 胜 券 第 四 篇
  • springboot mysql链接语句字段分析

    jdbc mysql localhost 3306 xxxx useUnicode true characterEncoding utf8 zeroDateTimeBehavior convertToNull useSSL true ser
  • 几个简单的system(const char* _Command)函数命令

    几个简单的system const char Command 函数命令 呼出终端 Windows键 r 然后输入cmd system const char Command 函数常用命令 如 system cls 1 shutdown常用命令
  • JS 实现全屏切换,移动端适用

    JS 实现全屏切换 移动端适用 直接看代码吧 简单 只是有些人不知道这个 api 我之前就不知道
  • tensorflow搭建自己的残差网络(ResNet)

    废话不说 直接上代码 首先 pip install tflearn 训练代码 coding utf 8 from future import division print function absolute import import tf
  • python HTTP Server 文件上传与下载

    实现在局域网 同一WIFI下 文件上传与下载 该模块通过实现标准GET在BaseHTTPServer上构建 和HEAD请求 将所有代码粘贴到同一个py文件中 即可使用 所需包 基于python3版本实现 python2版本无涉猎 impor
  • LeetCode-1606. 找到处理最多请求的服务器、C++中优先队列的使用

    你有 k 个服务器 编号为 0 到 k 1 它们可以同时处理多个请求组 每个服务器有无穷的计算能力但是 不能同时处理超过一个请求 请求分配到服务器的规则如下 第 i 序号从 0 开始 个请求到达 如果所有服务器都已被占据 那么该请求被舍弃