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

news/2025/1/15 14:51:25/文章来源:https://www.cnblogs.com/yuhixyui/p/18412403

由题目中求“最多可以连续运行的机器人数目”可知,求的是数组子数组的长度,那么就可以直接使用滑动窗口求解。配合前缀和,可以快速的求得滑动窗口内的运行时间和。那么编写代码如下:

int maximumRobots(vector<int> &chargeTimes, vector<int> &runningCosts, long long budget)
{int n = chargeTimes.size();vector<long long> subSum;subSum.emplace_back(0);for (int i = 0; i < n; i++){subSum.emplace_back(subSum[i] + runningCosts[i]);}long long curCost = 0;int left = 0;int maxCharge;int res = 0;for (int right = 0; right < n; right++){curCost = subSum[right + 1] - subSum[left];maxCharge = chargeTimes[left];for (int i = left + 1; i <= right; i++)maxCharge = max(maxCharge, chargeTimes[i]);int temRes = right - left + 1;curCost = curCost * temRes + maxCharge;if (curCost <= budget){res = max(res, temRes);}else{left++;}}return res;
}

但是这样会超时,这是因为这段代码,对滑动窗口内的最大充电时间的维护是一个暴力算法,会导致算法整体的时间复杂度到O(n^2)。可以考虑用一个有序的数组来维护滑动窗口内的最大充电时间。比如红黑树,结构中最后一个元素为最大充电时间,在窗口增大缩小时,也能够很快的进行元素的删除和增加,那么有以下实现:

int maximumRobots(vector<int> &chargeTimes, vector<int> &runningCosts, long long budget)
{int n = chargeTimes.size();vector<long long> subSum;map<int, int> mp;subSum.emplace_back(0);for (int i = 0; i < n; i++){subSum.emplace_back(subSum[i] + runningCosts[i]);}long long curCost = 0;int left = 0;int res = 0;for (int right = 0; right < n; right++){curCost = subSum[right + 1] - subSum[left];mp[chargeTimes[right]]++;int temRes = right - left + 1;curCost = curCost * temRes + (--mp.end())->first;if (curCost <= budget){res = max(res, temRes);}else{if (--mp[chargeTimes[left]] == 0)mp.erase(chargeTimes[left]);left++;}}return res;
}

用红黑树的方法很好理解,但是有点杀鸡用牛刀的意思。。。实现还有优化空间,可以考虑用一个双端队列实现单调队列,以此维护窗口内的最大充电时间,队列的首个元素为最大充电时间。在窗口右拓的时候,可以从后往前舍弃队列中的元素;而在窗口左缩的时候,可以从前往后弹出元素。在队列中存入最大充电时间的下标,将更加容易实现这个代码:

int maximumRobots(vector<int> &chargeTimes, vector<int> &runningCosts, long long budget)
{int n = chargeTimes.size();vector<long long> subSum;deque<int> dq;subSum.emplace_back(0);for (int i = 0; i < n; i++){subSum.emplace_back(subSum[i] + runningCosts[i]);}long long curCost = 0;int left = 0;int res = 0;for (int right = 0; right < n; right++){while (!dq.empty() && chargeTimes[dq.back()] <= chargeTimes[right])dq.pop_back();dq.push_back(right);while (!dq.empty() && (subSum[right + 1] - subSum[left]) * (right - left + 1) + chargeTimes[dq.front()] > budget){if (dq.front() == left)dq.pop_front();left++;}if (!dq.empty())res = max(res, right - left + 1);}return res;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796615.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

路由器刷机踩坑

ssh/telnet 路由器一般是用23端口,也就是telnet。具体如何开启ssh看型号。 breed breed是一个bootloader,在功能上类似于手机的Rec,用于提供一个界面刷入不同分区的镜像(至少不用敲命令行了)。 注意 breed不能用于刷入原厂固件,否则会砖(我就是这么干的)。 这是恩山论坛…

Pbootcms网站挂马解决方案(详细说明)

当你的PbootCMS网站被挂马时,应该立即采取措施来清除恶意代码,并加强系统的安全性,防止未来的攻击。以下是一个详细的解决方案: 1. 备份现有数据 在开始任何修复工作之前,首先备份你的网站数据,包括数据库和文件系统。这一步骤是为了防止在修复过程中丢失重要数据。 2. 检…

SVN在MacOS下报E230001错误

#macos #rider for Mac #SVN #E230001svn为什么会报E230001错误呢?根据详细错误信息Server SSL certificate verification failed: certificate issued知道这是https证书有问题,不用管它证书了,这里介绍一种简单的方法。 首先,打开终端(terminal,mac os/linux一般都是带…

面试-JS Web API - 存储

cookie HTML5存储(localStorage 和 sessionStorage)cookie cookie本身用于浏览器和server通讯的,被借用到本地存储来。可以用document.cookie来修改。同一个变量会覆盖,不同变量会追加。localStorage 和 sessionStorage// 保存数据到 localStorage localStorage.getItem(a,10…

MySQL8的新特性

一 字典数据与资源管理1.1 数据字典 以前MySQL都是采用元数据文件、非事务性表结构或者是存储引擎特有的方式来存储字典数据,这些字典数据通常都是以数据对象为主,比如说最常见的表结构信息等。 在MySQL8.0中,这些字典数据都被移动到拥有InnoDB存储引擎的事务性表中进行存储…

通义灵码获得国产 AI 编码工具最高成绩丨阿里云云原生 8 月产品月报

《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供…

执行yarn命令的时候报错: error Error: certificate has expired

完整错误:原因是:SSL证书过期 执行命令关闭验证: yarn config set strict-ssl false

《抽象代数》系列之群论入门

一、重要性 1.1 领域意义 群论是数学的一个分支,主要研究代数结构中的群、环、域等。尽管它看似抽象,但在编程领域,群论有着广泛的应用和深刻的意义。算法设计与优化:群论在算法设计中发挥着重要作用。例如,在密码学中,群论被用于设计安全的加密算法,如椭圆曲线密码学,…

【转】Chrome 的无头模式升级了:推出 --headless=new

Chrome的无头模式变得更好用了!本文概要介绍了近期的工程工作,让 Headless 更接近Chrome的常规“Headful”模式,让Headless对开发者更有用。 背景 早在 2017 年,Chrome 59 便引入了所谓的无头模式,可让您在没有任何可见界面的无人值守环境中运行浏览器。从本质上讲,就是在…

Hadoop(六)生产集群搭建(三)

完全分布式运行模式 一、群起集群 1、配置workers [user@hadoop102 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers在文件中添加如下内容: hadoop102 hadoop103 hadoop1042、启动集群 (1)如果集群是第一次启动,需要在hadoop102节点格式化NameNode [user@hadoop…

延迟退休!我们又可以愉快的打工了

延迟退休! 我们又可以愉快的打工了希望可以活到办理退休那天🐸本文来自博客园,作者:bigroc,转载请注明原文链接:https://www.cnblogs.com/bigroc/p/18412267blog:http://www.bigroc.cn博客园:https://www.cnblogs.com/bigroc

面试官:线程池遇到未处理的异常会崩溃吗?

首先,这个问题考察的是你对线程池 execute 方法和 submit 方法的理解,在 Java 线程池的使用中,我们可以通过 execute 方法或 submit 方法给线程池添加任务,但如果线程池中的程序在执行时,遇到了未处理的异常会怎么呢?接下来我们一起来看。 1.execute方法 execute 方法用于…