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

力扣刷题之2398.预算内的最多机器人数目

题干描述

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

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

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

示例 1:

输入:chargeTimes = [3,6,1,3,4], runningCosts = [2,1,3,4,5], budget = 25
输出:3
解释:
可以在 budget 以内运行所有单个机器人或者连续运行 2 个机器人。
选择前 3 个机器人,可以得到答案最大值 3 。总开销是 max(3,6,1) + 3 * sum(2,1,3) = 6 + 3 * 6 = 24 ,小于 25 。
可以看出无法在 budget 以内连续运行超过 3 个机器人,所以我们返回 3 。

示例 2:

输入:chargeTimes = [11,12,19], runningCosts = [10,8,7], budget = 19
输出:0
解释:即使运行任何一个单个机器人,还是会超出 budget,所以我们返回 0 。

题干分析

题目解析

      现在我们手里有n个机器人,给定两个长度为n的整数数组:

  • chargeTimes:第 iii 个机器人需要的充电时间。
  • runningCosts:第 iii 个机器人运行的成本。

还有一个整数budget用来表示我们的预算。

要求 

      找到可以连续运行的最多机器人kmax,使得运行这k个机器人的总开销不超过预算budge。

解题思路

1.滑动窗口法:
  • 由于机器人必须连续运行,适合使用滑动窗口来遍历所有可能的连续子数组。
  • 窗口的做优边界分别为left和right,初始化都为0。
2.维护窗口内的最大值和总和:
  • 最大充电时间:徐璈高效地获取当前窗口内的最大值。
  • 使用双端队列来维护窗口内的最大值。
  • 而运行成本总和;累加runningCosts,在窗口移动时更新。
3.双端队列维护最大值:
  • 双端队列存储窗口内可能成为最大值的元素的下标。
  • 保持队列单调递减,即队首始终是当前窗口的最大值。 
4.算法步骤:
初始化
  • maxLen = 0:记录满足条件的最大机器人数目。
  • left = 0:窗口左边界。
  • sumCosts = 0:当前窗口内运行成本的总和。
  • deque:用于维护窗口内的最大充电时间。
  • front = 0, rear = -1:双端队列的头尾指针。
 遍历数组

对于 right0n-1

  • 扩大窗口
    • 将当前元素 chargeTimes[right] 维护到 deque 中:
      • 移除 deque 末尾所有小于等于 chargeTimes[right] 的元素。
      • right 加入 deque 末尾。
    • 更新 sumCosts += runningCosts[right]
  • 检查窗口是否满足预算
    • 计算当前窗口的总开销
    • 如果 totalCost 超过 budget,需要缩小窗口:
      • 如果 deque[front] == left,说明窗口左端的最大值要移出窗口,从 deque 中移除队首。
      • 更新 sumCosts -= runningCosts[left],移动 left
    • 重复以上步骤,直到 totalCost 不超过 budget
  • 更新最大长度
    • 计算当前窗口长度 currentLen = right - left + 1
    • 如果 currentLen > maxLen,更新 maxLen = currentLen
5.返回结果

返回maxLen,即在预算内可以连续裕兴的最多机器人数目。 

代码展示 

int maximumRobots(int* chargeTimes, int chargeTimesSize, int* runningCosts, int runningCostsSize, long long budget) {typedef long long ll;int maxLen = 0;int left = 0;ll sumCosts = 0;// 定义双端队列来维护窗口内的最大 chargeTimeint deque[chargeTimesSize];int front = 0, rear = -1;for (int right = 0; right < chargeTimesSize; right++) {// 维护双端队列,保持队列中的元素递减while (rear >= front && chargeTimes[deque[rear]] <= chargeTimes[right]) {rear--;}deque[++rear] = right;// 更新运行成本之和sumCosts += runningCosts[right];// 检查当前窗口是否满足预算要求while (front <= rear) {ll totalCost = (ll)chargeTimes[deque[front]] + (right - left + 1) * sumCosts;if (totalCost <= budget) {break;}// 移动左指针,调整窗口if (deque[front] == left) {front++;}sumCosts -= runningCosts[left];left++;}// 更新最大长度int currentLen = right - left + 1;if (currentLen > maxLen) {maxLen = currentLen;}}return maxLen;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Windows】使用 WMI 获取系统版本信息
  • Errorresponsefromdaemon:toomanyrequests:Youhavereachedyourpullratelimit.
  • JVM运行区域介绍
  • C#基于SkiaSharp实现印章管理(7)
  • 计算机网络 --- 初识协议
  • windows 使用wsl安装docker
  • POD内的容器之间的资源共享
  • CLUSTERDOWN Hash slot not served问题复现
  • 【隐私计算】Paillier半同态加密算法
  • node前端开发基本设置
  • rust GUI框架Tauri入门——基于vanilla.js
  • 【C语言】联合体枚举的讲解
  • 02请求响应(简单参数)
  • Java学习Day42:骑龙救!(springMVC)
  • PostMan使用变量
  • Java,console输出实时的转向GUI textbox
  • Js基础知识(一) - 变量
  • PHP面试之三:MySQL数据库
  • SQL 难点解决:记录的引用
  • 对象管理器(defineProperty)学习笔记
  • 我的zsh配置, 2019最新方案
  • 转载:[译] 内容加速黑科技趣谈
  • 第二十章:异步和文件I/O.(二十三)
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2015)JS ES6 必知的十个 特性
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (CPU/GPU)粒子继承贴图颜色发射
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (离散数学)逻辑连接词
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)Honghu Cloud云架构一定时调度平台
  • (三十五)大数据实战——Superset可视化平台搭建
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (一) 初入MySQL 【认识和部署】
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)编辑寄语:因为爱心,所以美丽
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET DataGridView数据绑定说明
  • .Net 代码性能 - (1)
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • /boot 内存空间不够
  • /var/lib/dpkg/lock 锁定问题
  • @GetMapping和@RequestMapping的区别
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [AI资讯·0612] AI测试高考物理题,最高准确率100%,OpenAI与苹果合作,将ChatGPT融入系统中,大模型在物理领域应用潜力显现