LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
2398. 预算内的最多机器人数目
today 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
选择前 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 .
注意:
chargeTimes.length == runningCosts.length == n
1 <= n <= 5*10^4
1 <= chargeTimes[i], runningCosts[i] <= 10^5
1 <= budget <= 10^15
题目解析
解题思路:双指针+单调队列。
我们首先可以使用双指针来维护一个窗口,窗口的左右边界分别为 left
和 right
。 表示在left
和right
之间的机器人,可以正常运行。
如果left
和right
之间数值的和大于budget
,我们需要缩小窗口,向右移动left
,直到窗口内的机器人数目小于等于budget
。
同时,我们使用一个单调队列来维护窗口内机器人的chargeTimes
最大值。
遍历过程中right-left+1
的最大值,即为最多可以连续运行的机器人数目。
单调队列实现方法:
- 维护一个单调递减的队列
max_charge
,初始为空。 - 对于每个新加入机器人对应的
chargeTime
即chargeTimes[right]
,如果chargeTime
大于队尾元素,则将队尾元素弹出直到队尾元素大于等于chargeTime
,将chargeTime
入队。这样保证了max_charge
队列是单调递减的。 max_charge
队头元素,即为当前窗口内的最大充电时间。
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n)
代码实现
Python实现:
from collections import dequeclass Solution:def maximumRobots(self, chargeTimes, runningCosts, budget):n = len(chargeTimes)left = 0sum_running_cost = 0max_charge = deque() # 单调队列,用于存储当前窗口内的最大充电时间res = 0for right in range(n):# 更新窗口内的运行成本总和sum_running_cost += runningCosts[right]# 维护单调队列,保证队列中的元素是递减的,以便快速获得窗口内最大充电时间while max_charge and chargeTimes[right] > max_charge[-1]:max_charge.pop()max_charge.append(chargeTimes[right])# 计算当前窗口的总开销while max_charge and max_charge[0] + (right - left + 1) * sum_running_cost > budget:# 如果超出预算,移动 left 缩小窗口,并更新相关值if chargeTimes[left] == max_charge[0]:max_charge.popleft()sum_running_cost -= runningCosts[left]left += 1# 更新最大运行机器人数res = max(res, right - left + 1)return res
Go实现:
func maximumRobots(chargeTimes []int, runningCosts []int, budget int64) int {n:=len(chargeTimes)left,right:=0,0sum_cost,ans:=0,0max_charge:=make([]int,0)for right=0;right<n;right++{//更新窗口内的运行成本总和sum_cost+=runningCosts[right]//维护单调队列,保证队列中的元素是递减的,以便快速获得窗口内最大充电时间for len(max_charge)>0 && max_charge[len(max_charge)-1]<chargeTimes[right]{max_charge=max_charge[:len(max_charge)-1]}max_charge=append(max_charge,chargeTimes[right])for left<=right && max_charge[0]+(right-left+1)*sum_cost>int(budget){//如果超出预算,移动 left 缩小窗口,并更新相关值if chargeTimes[left]==max_charge[0]{max_charge=max_charge[1:]}sum_cost-=runningCosts[left]left++}ans=max(ans,right-left+1)}return ans}
C++实现:
class Solution {
public:int maximumRobots(vector<int>& chargeTimes, vector<int>& runningCosts, long long budget) {int n = chargeTimes.size();int left = 0;long long sum_cost = 0;int ans = 0;deque<int> max_charge;for (int right = 0; right < n; right++) {// 更新窗口内的运行成本总和sum_cost += runningCosts[right];// 维护单调队列,保证队列中的元素是递减的,以便快速获得窗口内最大充电时间while (!max_charge.empty() && max_charge.back() < chargeTimes[right]) {max_charge.pop_back();}max_charge.push_back(chargeTimes[right]);// 如果超出预算,移动 left 缩小窗口,并更新相关值while (left <= right && max_charge.front() + (right - left + 1) * sum_cost > budget) {if (chargeTimes[left] == max_charge.front()) {max_charge.pop_front(); // 移除最大充电时间}sum_cost -= runningCosts[left];left++;}// 更新最大可运行的机器人数量ans = max(ans, right - left + 1);}return ans;}
};
相关文章:
LeetCode:2398. 预算内的最多机器人数目 双指针+单调队列,时间复杂度O(n)
2398. 预算内的最多机器人数目 today 2398. 预算内的最多机器人数目 题目描述 你有 n 个机器人,给你两个下标从0开始的整数数组 chargeTimes 和 runningCosts ,两者长度都为 n 。第 i 个机器人充电时间为 chargeTimes[i] 单位时间,花费 ru…...

oracle 插入date日期类型的数据、插入从表中查出的数据,使用表中的默认数据
date sysdate to_date 插入从表中查出的数据 方式一 方式二 或者指定列名称 下边这个案例的前提是指定列插入,如果不指定,则也是默认的...

物流系统打单软件 佳易王物流运单怎么打印教程
一、前言 物流系统打单软件 佳易王物流运单怎么打印教程 1、佳易王物流管理系统可同时打印物流单和标签 2、如果一台电脑上有多台打印机,软件可以设置物流或标签对应的打印机,系统自动识别打印机。 二、软件程序图文说明 1、上图为 物流单在空白单上打…...
二叉树计算
题目描述 给出一个二叉树,请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。左子树表示该节点左侧叶子节点为根节点的一颗新树;右子树表示该节点右侧叶子节点为根节点的一颗新树。 输入描述 2行整数&#…...
Java并发执行举例
在Java中实现并发执行可以通过多种方式,最常见的方式包括使用线程、ExecutorService、ForkJoinPool等。以下是几种常用并发执行的示例: 1. 使用Thread类 这是Java中最基础的并发实现,通过创建一个继承自Thread的类或实现Runnable接口来定义…...
Java 基础知识九(网络编程)
UDP DatagramSocket:通讯的数据管道 -send 和receive方法 -(可选,多网卡)绑定一个IP和Port DatagramPacket -集装箱:封装数据 -地址标签:目的地IPPort package org.example.net;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.n…...
深入解析Go语言的类型方法、接口与反射
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 Go语言作为一门现代编程语言,以其简洁高效的特性受到广大开发者的喜爱。在本文中,我们将深入探讨Go语言中的类型方法、接口和反射机制。通过丰富的代码示例和详尽的解释,帮助您全面理解这些关键概念,并在实际…...
C#中线程池【异步】
在 WinForm 项目中,线程池中的线程主要用于执行异步和并发任务。当你调用某些异步方法或使用并行编程时,线程池中的线程就会被使用。 在以下场景中,线程池的线程会被使用: 使用场景 异步任务执行 当你使用 Task.Run() 或 TaskF…...

OpenAI 刚刚推出 o1 大模型!!突破LLM极限
北京时间 9 月 13 日午夜,OpenAI 正式发布了一系列全新的 AI 大模型,专门用于应对复杂问题。 这一新模型的出现代表了一个重要突破,其具备的复杂推理能力远远超过了以往用于科学、代码和数学等领域的通用模型,能够解决比之前更难的…...

【Vmware16安装教程】
📖Vmware16安装教程 ✅1.下载✅2.安装 ✅1.下载 官网地址:https://www.vmware.com/ 百度云盘:Vmware16下载 123云盘:Vmware16下载 ✅2.安装 1.双击安装包VMware-workstation-full-16.1.0-LinuxProbe.Com.exe,点击…...

Delphi5利用DLL实现窗体的重用
文章目录 效果图参考利用DLL实现窗体的重用步骤1 设计出理想窗体步骤2 编写一个用户输出的函数或过程,在其中对窗体进行创建使它实例化步骤3 对工程文件进行相应的修改以适应DLL格式的需要步骤4 编译工程文件生成DLL文件步骤5 在需要该窗体的其他应用程序中重用该窗…...
使用JavaWeb开发注册功能时,校验用户名是否已存在的一个思路(附代码)
在开发 Web 应用程序时,用户注册是一个常见的功能。为了确保每个用户都有一个唯一的用户名,我们需要在用户注册时检查数据库中是否已经存在该用户名。本文将详细介绍如何在 Servlet 中使用 JDBC 技术来检查用户名是否存在。 1. JDBC 简介 Java Databas…...

前端常见面试-首页性能提升、项目优化
首页性能提升 Vue 首页性能提升是Vue应用开发中非常重要的一环,它直接影响用户体验和应用的加载速度。以下是一些关键的Vue首页性能提升策略: 1. 代码分割与懒加载 路由懒加载:利用Webpack的动态导入(import())特性…...

卷王阿里又开启价格战,大模型价格降价85%!
我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 9月19日,就是昨天,一年一度的云计算盛…...
Java中的异步编程模式:CompletableFuture与Reactive Programming的实战
Java中的异步编程模式:CompletableFuture与Reactive Programming的实战 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代Java开发中,异步编程已经成为提高应用性能和…...

7iDU AMP田岛绣花机驱动器维修0J2100400022
7iDU AMP神州田岛绣花机驱动器维修0J2101300000绣花机控制器等全系列型号均可处理。 田岛7iDU AMP是田岛绣花机中使用很广的一种5相驱动器,在田岛平绣车TMEF-H,TMFD中应用,在链条车TMCE112S,和盘带车TMLG中大量使用。其采用的东芝…...

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现
部署资源 AUTODL 使用最小3080Ti 资源,cuda > 12.0使用云服务器,部署fastGPT oneAPI,M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 - 如何下载huggingface huggingface-cli download Qwen/Qwen2-…...

vue websocket 使用
基于webSocket通信的库主要有 socket.io,SockJS 关于SockJS的使用 先安装 sockjs-client 和 stompjs npm install sockjs-client npm install stompjs import SockJS from sockjs-client; import Stomp from stompjs; export default { data () { …...
Spring Boot 入门面试五道题
在准备Spring Boot面试时,从简单到困难设计面试题可以帮助你系统地复习和评估自己的掌握程度。以下是五个不同难度的Spring Boot面试题: 1. 简单题:什么是Spring Boot?它主要解决了什么问题? 答案: Sprin…...

【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)
文章目录 前言一、ArkTS基本介绍1、 ArkTS组成2、组件参数和属性2.1、区分参数和属性的含义2.2、父子组件嵌套 二、装饰器语法1.State2.Prop3.Link4.Watch5.Provide和Consume6.Observed和ObjectLink代码示例:示例1:(不使用Observed和ObjectLi…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...