当前位置: 首页 > article >正文

单调队列,LeetCode 2398. 预算内的最多机器人数目

一、题目

1、题目描述

你有 n 个机器人,给你两个下标从 0 开始的整数数组 chargeTimes 和 runningCosts ,两者长度都为 n 。第 i 个机器人充电时间为 chargeTimes[i] 单位时间,花费 runningCosts[i] 单位时间运行。再给你一个整数 budget 。

运行 k 个机器人 总开销 是 max(chargeTimes) + k * sum(runningCosts) ,其中 max(chargeTimes) 是这 k 个机器人中最大充电时间,sum(runningCosts) 是这 k 个机器人的运行时间之和。

请你返回在 不超过 budget 的前提下,你 最多 可以 连续 运行的机器人数目为多少。

2、接口描述

python3
 ​
class Solution:
    def maximumRobots(self, chargeTimes: List[int], runningCosts: List[int], budget: int) -> int:
cpp
class Solution {
public:
    int maximumRobots(vector<int>& chargeTimes, vector<int>& runningCosts, long long budget) {
        
    }
};

3、原题链接

2398. Maximum Number of Robots Within Budget


二、解题报告

1、思路分析

固定右端点r,r右移其合法左端点l不会后退,具有单调性,考虑滑窗

由于要获取滑窗最值,考虑单调队列

维护一个单调队列,队头到队尾chargeTime单调递减,即队头最大

i 代表窗口右端点,j 代表窗口左端点

那么过程中当 花费 > budget,往右收缩 j 同时根据 j 来弹出队头

维护i - j + 1的最大值即可

2、复杂度

时间复杂度: O(N)空间复杂度:O(N)

3、代码详解

python3
 ​
class Solution:
    def maximumRobots(self, chargeTimes: list[int], runningCosts: list[int], budget: int) -> int:
        n = len(chargeTimes)
        tc = list(zip(chargeTimes, runningCosts))
        dq = deque()
        s = 0
        res = 0
        j = 0
        for i, (t, c) in enumerate(tc):
            s += c
            while dq and t >= tc[dq[-1]][0]:
                dq.pop()
            dq.append(i)
            while dq and tc[dq[0]][0] + (i - j + 1) * s > budget:
                if dq[0] == j: dq.popleft()
                s -= tc[j][1]
                j += 1
            res = max(res, i - j + 1)        
        return res
cpp
 ​
class Solution {
public:
    int maximumRobots(vector<int>& chargeTimes, vector<int>& runningCosts, long long budget) {
        std::deque<int> dq;
        int res = 0;
        long long s = 0;
        int n = chargeTimes.size();
        for (int i = 0, j = 0; i < n; ++ i) {
            s += runningCosts[i];
            while (dq.size() && chargeTimes[i] >= chargeTimes[dq.back()]) dq.pop_back();
            dq.push_back(i);
            while (dq.size() && chargeTimes[dq.front()] + (i - j + 1) * s > budget) {
                if (dq.front() == j) dq.pop_front();
                s -= runningCosts[j ++];
            }
            res = std::max(res, i - j + 1);
        }
        
        return res;
    }
};
 ​

http://www.kler.cn/a/308768.html

相关文章:

  • 前端开发中常用的包管理器(npm、yarn、pnpm、bower、parcel)
  • Android音频架构
  • 虚拟机安装Ubuntu 24.04服务器版(命令行版)
  • 基于Python+Django+Vue3+MySQL实现的前后端分类的商场车辆管理系统
  • unity基础,点乘叉乘。
  • 欧国联的规则,你都了解吗?
  • ai 回答HFS是什么 HTTP的文件服务器是什么
  • 数据结构之排序算法的分析和应用
  • 【数据结构篇】~链表算法题3(环形链表)
  • C# net跨平台上位机开发(avalonia)附demo源码
  • 牛客背包问题练习 xinjun与阴阳师
  • 苍穹外卖学习笔记(八)
  • 【案例71】配置https之后 IE打不开登陆页面 Uclient没有问题
  • 《微信小程序实战(2) · 组件封装》
  • 【重学 MySQL】二十七、七种 join 连接
  • 宝塔Linux部署 Vue + Spring Boot + MySQL + Redis
  • Parallels Desktop 20 for Mac 正式发布,更新了哪些新功能(附下载链接)!
  • 深度学习驱动超材料设计领域发展
  • 用Inno Setup打包QT程序输出安装包
  • 消息队列的幂等问题解决方案
  • 51单片机+proteus+学习3(串口、矩阵按键)
  • 了解华为云容器引擎(Cloud Container Engine)
  • 关于http的206状态码和416状态码的意义、断点续传以及CORS使用Access-Control-Allow-Origin来允许跨域请求
  • 网络运维故障处理案例
  • 武汉传媒学院联合创龙教仪建设DSP教学实验箱,基于DSP C6000平台搭建
  • Pytorch详解-模型模块(RNN,CNN,FNN,LSTM,GRU,TCN,Transformer)