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

news2024/11/18 3:37:37

【每日一题】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 。

代码实现

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. 返回结果:遍历完成后,返回记录的最大机器人数量。

优化后的代码实现

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.coloradmin.cn/o/2133199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

喂料机和失重秤的区别?

喂料机和失重秤的区别&#xff1f;在硬件结构上的具体差异&#xff1a; 1. 喂料机的硬件结构 喂料机的结构比较简单&#xff0c;主要功能是传送物料&#xff0c;不涉及精确的称重系统。其硬件结构通常包括以下部分&#xff1a; 料斗&#xff1a;用于存储物料&#xff0c;物料…

cesium.js 入门到精通(7)

我们说一下相机的概念&#xff1a; 生活中的相机是一个用来拍照的设备&#xff0c;而这里的相机应该理解成一个人机交互的媒介。地图的缩放、平移、旋转&#xff0c;以及相关的鼠标操作都是由相机作为媒介来实现的。相机的位置和姿态参数决定了我们能看到的地图的样子。 可以…

centos7.9安装clamav教程

本章教程主要记录在centos7.9安装clamav过程。 ClamAV(Clam AntiVirus)是一个开源的防病毒软件工具,主要用于检测和消除恶意软件。它最初由 Tomasz Kojm 于 2001 年开发,并由 Cisco Systems 维护和支持。ClamAV 广泛应用于邮件网关、文件服务器和其他需要防病毒保护的环境中…

Linux软件包循环依赖解决 彻底删除i386架构 更新软件源

0.问题 之前为了wine和intel核显驱动加了32位的库&#xff0c;现在每次apt upgrade更新都被循环依赖弄得不堪其扰&#xff0c;apt --fix-broken install解决缺失都循环报错&#xff0c;寸步难行&#xff0c;忍无可忍、 而且一看全是i386的依赖&#xff0c;这32位我不用也罢&…

apache文件共享和访问控制

实现apache文件共享 文件共享路径 <Directory "/var/www/html"> #默认发布路径&#xff0c;功能限制 Options Indexes FollowSymLinks #indexes支持文件共享功能 AllowOverride None Require all granted </Directory> 进入到该路径下 cd…

【Java Bean Validation API】Spring3 集成 Bean 参数校验框架

Spring3 集成 Bean 参数校验框架 Java Bean Validation API 1. 依赖 Spring 版本&#xff1a;3.0.5 Java 版本&#xff1a;jdk21 检验框架依赖&#xff08;也可能不需要&#xff0c;在前面 spring 的启动依赖里就有&#xff09;&#xff1a; <!-- 自定义验证注解 -->…

【原创】java+springboot+mysql高校社团网系统设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

spring内置的

程序里注入了spring内置的线程池&#xff0c;但没有看到线程池相关参数配置&#xff08;corePoolSize maxPoolSize 队列大小&#xff09;&#xff0c;网上查说默认是1个线程&#xff0c;结果和生产实际看到的不一致。 从生产可以看到有8个线程在跑&#xff0c;task-1 task-8&am…

buildroot移植qt报错Info: creating stash file (补充qt添加字库)

移植qt库&#xff0c;编译文件报错Info: creating stash file /home/rbing/QT/uart/.qmake.stash Project ERROR: Unknown module(s) in QT: serialport rbingouc:~/QT/uart$ /home/rbing/linux/tool/buildroot-2022.02.9/output/host/usr/bin/qmake Info: creating stash fil…

PCI Express 体系结构导读摘录(六)

系列文章目录 PCI Express 体系结构导读摘录&#xff08;一&#xff09; PCI Express 体系结构导读摘录&#xff08;二&#xff09; PCI Express 体系结构导读摘录&#xff08;三&#xff09; PCI Express 体系结构导读摘录&#xff08;四&#xff09; PCI Express 体系结构导读…

HarmonyOS开发实战( Beta5.0)画笔调色板案例实践

鸿蒙HarmonyOS开发往期必看&#xff1a; HarmonyOS NEXT应用开发性能实践总结 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门到精通&#xff09; 介绍 本示例实现了一个网格渐变的画笔调色板&#xff0c;能够根…

Vector - VT System - 板卡_VT板卡使用介绍_01

总体介绍 在常规的车载网络测试中&#xff0c;除了我们常用的使用VN系列设备进行总线协议测试&#xff0c;大多数公司都会将协议强相关的功能测试放在了功能侧&#xff0c;但是实际上这块对于车载网络测试工程师来说也是需要去了解的&#xff0c;毕竟只有懂协议的人才能更好的测…

Python with 关键字语法糖

参考文章: Python with 关键字 | 菜鸟教程 (runoob.com)https://www.runoob.com/python3/python-with.html Python 中的 with 语句用于异常处理&#xff0c;封装了 try…except…finally 编码范式&#xff0c;提高了易用性。 with 语句使代码更清晰、更具可读性&#xff0c; 它…

Fake Location模拟定位,刷跑 “运动世界校园”

前言:"科技改变生活&#xff0c;如果本文章对你有帮助&#xff0c;别忘记留下你的点赞&#xff0c;以下我对环境特变刁钻的运动世界校园为实例&#xff0c;也是成功安全正常上传数据&#xff0c;如果遇到问题&#xff0c;请留言评论区&#xff0c;所有链接我会放在文章头部…

157-安全开发-Python 自动化挖掘项目SRC 目标FOFA 资产Web 爬虫解析库

案例一&#xff1a;Python-WEB 爬虫库&数据解析库 这里开发的内容不做过多描述&#xff0c;贴上自己写的代码 爬取数据 要爬取p标签&#xff0c;利用Beautyfulsoup模块 import requests,time from bs4 import BeautifulSoup#url"https://src.sjtu.edu.cn/rank/firm…

99AutoML 自动化机器学习实践--NNI 自动化机器学习工具包

NNI 自动化机器学习工具包 NNI 是 Neural Network Intelligence 的缩写&#xff0c;可以译作&#xff1a;智能神经网络。名字听起来陌生&#xff0c;但 NNI 实际上就是一个自动化机器学习工具包。它通过多种调优的算法来搜索最好的神经网络结构和超参数&#xff0c;并支持单机、…

【Fastapi】使用Pandas作为大数据分析处理工具

【Fastapi】使用Pandas作为大数据分析处理工具 gitee https://gitee.com/zz1521145346/fastapi_frame.git github https://github.com/zz001357/fastapi_frame.git 准备工作 能联接的sql软件&#xff08;如&#xff0c;mysql&#xff09; 安装pandas &#xff08;pip in…

vue3 使用swiper制作带缩略图的轮播图

效果图 实现代码 <template><div class"wrap"><!-- 主轮播图 --><swiper :style"{--swiper-navigation-color: #fff,--swiper-pagination-color: #fff,}" :modules"modules" :navigation"true" :thumbs"{ …

深圳建站公司-如何做网站

深圳建站公司&#xff1a;如何制作一个成功的网站 在信息化快速发展的今天&#xff0c;企业和个人越来越重视网络形象&#xff0c;网站成为了展示品牌、推广产品和服务的重要平台。深圳作为科技创新和经济发展的前沿城市&#xff0c;涌现出许多专业的建站公司&#xff0c;能够为…

食品分类2检测系统源码分享

食品分类2检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vi…