【每日一题】LeetCode 2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和、堆(优先队列))

news/2024/9/18 14:59:16/ 标签: leetcode, 算法, 数据结构, java, eclipse

【每日一题】LeetCode 2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和、堆(优先队列))

题目描述

给定两个整数数组 chargeTimesrunningCosts,分别代表 n 个机器人的充电时间和运行成本。再给定一个整数 budget,表示预算。我们需要计算在不超过预算的情况下,最多可以连续运行多少个机器人。

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

思路分析

这个问题可以通过滑动窗口的方法来解决。我们的目标是在不超过预算的情况下,找到能够连续运行的最多机器人数量。

  1. 初始化两个指针 leftright 分别指向数组的起始位置,以及一些必要的变量,如 maxRobots 用于存储最大机器人数量,maxChargeTimes 用于存储窗口内的最大充电时间,sum 用于存储窗口内运行成本的总和。

  2. 使用 right 指针扩展窗口,将 right 指针所指的机器人加入到当前窗口中,更新 maxChargeTimessum

  3. 检查当前窗口的总开销是否超过预算。如果超过预算,通过移动 left 指针缩小窗口,直到窗口内的总开销不超过预算。

  4. 在每一步中,更新 maxRobots,记录下当前窗口内能够运行的最大机器人数量。

  5. 重复步骤 2-4,直到 right 指针遍历完整个数组。

  6. 返回 maxRobots 作为最终结果。

输入示例

  • 示例 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 。

代码实现

java">class Solution {public int maximumRobots(int[] chargeTimes, int[] runningCosts, long budget) {int n = chargeTimes.length;int maxRobots = 0; // 最多可以连续运行的机器人数目int maxChargeTimes = 0; // 当前窗口内的最大充电时间long sum = 0; // 当前窗口内的运行成本总和int left = 0; // 滑动窗口的左边界int right = 0; // 滑动窗口的右边界while (right < n) {// 扩展窗口,将当前机器人加入窗口maxChargeTimes = Math.max(maxChargeTimes, chargeTimes[right]);sum += runningCosts[right];// 当前窗口的总开销 = 最大充电时间 + 当前窗口内机器人数量 * 运行成本总和while (maxChargeTimes + (right - left + 1) * sum > budget) {// 如果当前窗口的总开销超过预算,缩小窗口sum -= runningCosts[left];left++;// 重新计算窗口内的最大充电时间maxChargeTimes = 0;for (int i = left; i <= right; i++) {maxChargeTimes = Math.max(maxChargeTimes, chargeTimes[i]);}}// 更新最大机器人数量maxRobots = Math.max(maxRobots, right - left + 1);right++;}return maxRobots;}
}

请添加图片描述

优化思路分析

使用双端队列(Deque)来维护一个单调递减的充电时间序列。这种方法可以更高效地处理窗口的扩展和收缩,从而减少不必要的计算。

  1. 维护单调队列:使用一个双端队列 q 来维护当前窗口内机器人的索引,这个队列按照机器人的充电时间从大到小的顺序排列。这样可以快速找到当前窗口内最大充电时间的机器人。

  2. 扩展窗口:遍历每个机器人,将其索引加入到队列中。如果队列尾部的机器人充电时间小于当前机器人的充电时间,则将其移除,因为当前机器人的充电时间更大,可以替换掉队列尾部的机器人。

  3. 计算运行成本总和:随着窗口的扩展,累加当前窗口内所有机器人的运行成本。

  4. 收缩窗口:如果当前窗口的总开销超过了预算,通过移除窗口左侧的机器人来缩小窗口,直到总开销不超过预算。同时,更新运行成本总和。

  5. 更新最大机器人数量:在每一步中,更新最大机器人数量 ans,记录下当前窗口内能够运行的最大机器人数量。

  6. 返回结果:遍历完成后,返回记录的最大机器人数量。

优化后的代码实现

java">import java.util.ArrayDeque;
import java.util.Deque;class Solution {public int maximumRobots(int[] chargeTimes, int[] runningCosts, long budget) {int ans = 0; // 记录最大机器人数量int left = 0; // 滑动窗口的左边界long sum = 0; // 当前窗口内的运行成本总和Deque<Integer> q = new ArrayDeque<>(); // 用于维护单调递减的充电时间序列for (int right = 0; right < chargeTimes.length; right++) {// 1. 扩展窗口while (!q.isEmpty() && chargeTimes[right] >= chargeTimes[q.peekLast()]) {q.pollLast(); // 移除队列尾部充电时间较小的机器人}q.addLast(right); // 将当前机器人加入队列sum += runningCosts[right]; // 更新运行成本总和// 2. 收缩窗口while (!q.isEmpty() && chargeTimes[q.peekFirst()] + (right - left + 1) * sum > budget) {if (q.peekFirst() == left) {q.pollFirst(); // 移除队列头部的机器人}sum -= runningCosts[left++]; // 更新运行成本总和}// 3. 更新答案ans = Math.max(ans, right - left + 1); // 更新最大机器人数量}return ans; // 返回最终结果}
}

请添加图片描述


http://www.ppmy.cn/news/1525221.html

相关文章

通过docker overlay2目录名查找容器名和容器ID

有时候经常会有个别容器占用磁盘空间特别大&#xff0c;这个时候就需要通过docker overlay2 日录名查找对应容器名. 1.首先进入到 /var/lib/docker/overlay2 目录下 # cd /var/lib/docker/overlay2 2.查看谁占用容间最大 # du -h -d 1 | grep G |sort -nr 3.再通过目录名查找…

【机器学习(二)】分类和回归任务-决策树算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;树的构造&#xff08;二&#xff09;划分选择1、信息增益2、基尼指数3、卡方检验 &#xff08;三&#xff09;停止标准&#xff08;四&#xff09;剪枝处理1、预剪枝2、后剪枝 三、决策树的优缺点四、决策树分类任…

centos下nvme over rdma 环境配置

nvme over rdma 环境配置 本文主要介绍NVMe over RDMA的安装和配置。关于什么是NVMe over Fabrics,什么是NVMe over RDMA&#xff0c;本文就不做介绍了&#xff0c;网上资料一大堆。 可以看看什么是NVMe over Fabrics&#xff1f; RDMA&#xff08;全称&#xff1a;Remote Dir…

DevOps -CI/CD 与自动化部署

DevOps - CI/CD 与自动化部署详解 DevOps 是一种结合开发&#xff08;Development&#xff09;与运维&#xff08;Operations&#xff09;的方法论&#xff0c;旨在通过工具和文化变革&#xff0c;促进软件开发和运维之间的协作&#xff0c;提升软件交付的效率、质量和稳定性。…

Golang | Leetcode Golang题解之第403题青蛙过河

题目&#xff1a; 题解&#xff1a; func canCross(stones []int) bool {n : len(stones)dp : make([][]bool, n)for i : range dp {dp[i] make([]bool, n)}dp[0][0] truefor i : 1; i < n; i {if stones[i]-stones[i-1] > i {return false}}for i : 1; i < n; i {…

Qt_控件的QWidget属性介绍

目录 1、QWidget的核心属性 2、enabled 3、geometry 3.1 代码测试geometry 4、windowTitle 4.1 代码测试windowTitle 5、windowIcon 5.1 QIcon设置图标 5.2 qrc机制 5.3 代码测试windowIcon 6、windowOpacity 6.1 代码测试windowOpacity 7、cursor 7.1 代码测试…

自动化任务的错误处理:编写健壮的自动化脚本,处理Office应用中的错误和异常情况

目录 引言 一、自动化任务概述 二、自动化脚本编写基础 2.1 环境准备 2.2 脚本结构 2.3 示例代码 三、Office应用中的错误和异常情况处理 3.1 文件访问权限问题 3.2 文件格式不兼容 3.3 宏病毒和安全性问题 3.4 控件错误和插件问题 四、异常处理与日志记录 4.1 捕…

Apple M3编译OpenSSL安卓平台SO库

1.下载OpenSSL源码: https://github.com/openssl/openssl.git 2.配置NDK环境变量:vim ~/.zprofile 添加ANDROID_NDK_ROOT环境变量,iosdev改为你自己的用户名 export ANDROID_NDK_ROOT=/Users/iosdev/Library/Android/sdk/ndk/23.1.7779620 添加NDK下可执行文件路径到PATH环…

工具、环境等其他小问题归纳

此篇文章内容会不定期更新&#xff0c;仅作为学习过程中的笔记记录 一、查询Windows 10环境下python版本与安装路径 若电脑成功安装了python环境&#xff0c;不小心忘了版本。 I、查询版本 1、cmd窗口快捷查询 Win R 输入cmd 进入窗口&#xff1b; 直接输入 python --version …

华为 HCIP 认证费用和报名资格

在当今竞争激烈的信息技术领域&#xff0c;华为 HCIP认证备受关注。它不仅能提升个人的技术实力与职业竞争力&#xff0c;也为企业选拔优秀人才提供了重要依据。以下将详细介绍华为 HCIP 认证的费用和报名资格。 一、HCIP 认证费用 华为HCIP认证的费用主要由考试费和培训费构成…

Linux 安装神州通用数据库 ShenTong7.0.8_342.92_linux64

Linux 安装神州通用数据库 ShenTong7.0.8_342.92_linux64 1、准备工作2、安装数据库3、启停数据库4、后续步骤 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Linux环境下安装神州通用数据库&#xff08;ShenTong&#xff09;是一个相对直…

Go中更安全的枚举

iota Go让你用iota来使用枚举。 const (Guest iotaMemberModeratorAdmin )虽然Go是明确的&#xff0c;但iota似乎相对模糊。如果你以任何其他方式对const组进行排序&#xff0c;你会引入副作用。在上面的例子中&#xff0c;你仅仅对第一个参数Guest赋值了。你可以显式地给每…

【前端】vue+html+js 实现table表格展示,以及分页按钮添加

一. 问题描述 数据条数太多显示到页面上时可能会渲染较慢&#xff0c;因此需要截取数据进行展示。 二. 代码写法 思路&#xff1a;按照上述图示思路&#xff0c;需要有两个数据列表&#xff0c;一个存储的是所有的列表数据&#xff0c;一个存储的是展示的数据列表&#xff0c…

jQuery UI API 文档

关于《jQuery UI API 文档》&#xff0c;我找到了一些有用的信息。jQuery UI 是建立在 jQuery JavaScript 库上的一组用户界面交互、特效、小部件及主题。如果您是 jQuery 新手&#xff0c;建议您先查看 jQuery 教程。目前&#xff0c;我找到的资料主要是关于 jQuery UI 1.10 版…

【加密社】深入理解TON智能合约 (FunC语法)

king: 摘要&#xff1a;在TON&#xff08;TheOpenNetwork&#xff09;区块链平台中&#xff0c;智能合约扮演着举足轻重的角色。本文将通过分析一段TON智能合约代码 带领读者学习dict&#xff08;字典&#xff09;和list&#xff08;列表&#xff09;在FunC语言中的用法&#x…

LeetCode_sql_day24(1212.查询球队积分)

描述 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表: Matches…

人工智能 | 搭建企业内部的大语言模型系统

大纲 开源大语言模型大语言模型管理私有大语言模型服务部署方案 开源大语言模型 担心安全与隐私&#xff1f;可私有部署的开源大模型 商业大模型&#xff0c;不支持私有部署 ChatGPTClaudeGoogle Gemini百度问心一言 开源大模型&#xff0c;支持私有部署 MistralMeta Llama…

【LeetCode】:面试题 16.05. 阶乘尾数

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 好久没有写文章了&#xff0c;今天碰见了一道有趣的题目&#xff0c;写下来分享一下。 &#x1f3c6;1.问题描…

【QT】系统-上

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;QT 目录 &#x1f449;&#x1f3fb;事件QWidget中常见的事件 &#x1f449;&#x1f3fb;处理鼠标事件&#xff1a;leaveEvent和enterEvent&#x1f449;&a…

简单代码实现视频转图片_py

目录 1.安装OpenCV 环境要求 安装命令 验证安装 2. OpenCV用法 3.实现程序 博主最近在研究深度学习&#xff0c;需要收集数据集进行处理&#xff0c;但一张张拍照真是太麻烦了 就想着&#xff0c;哎&#xff0c;能不能写一个程序&#xff0c;把视频转成图片不就行了&am…