首页 > 其他分享 >(nice!!!)LeetCode 2398. 预算内的最多机器人数目(队列、滑动窗口)

(nice!!!)LeetCode 2398. 预算内的最多机器人数目(队列、滑动窗口)

时间:2024-09-13 19:52:20浏览次数:15  
标签:qu chargeTimes 窗口 long ans 滑动 LeetCode 2398 nice

题目:2398. 预算内的最多机器人数目

在这里插入图片描述
在这里插入图片描述
思路:双端队列+滑动窗口。因为需要找连续的机器人,这里就需要用到滑动窗口。细节看注释,时间复杂度0(n)。

class Solution {
public:
    int maximumRobots(vector<int>& chargeTimes, vector<int>& runningCosts, long long budget) {
        int n=chargeTimes.size();
        int ans=0;
        //记录滑动窗口[i,j]之间的数组runningCosts和。
        long long sum=0;
        //双端队列,维护滑动窗口[i,j]之间数组chargeTimes元素递减的下标
        deque<int> qu;
        //i、j分别是滑动窗口的左右端点
        for(int i=0,j=0;j<n;j++){
        	//维护滑动窗口[i,j]之间数组chargeTimes元素递减的下标
            while(qu.size()&&chargeTimes[qu.back()]<=chargeTimes[j]) qu.pop_back();
            //将下标j插入
            qu.push_back(j);
            //累加runningCosts[j]值
            sum+=runningCosts[j];
            //如果区间[i,j]的开销大于budget,则将左端点左移,直到符合要求
            while(qu.size()&&(chargeTimes[qu.front()]+(j-i+1)*sum)>budget){
                //如果当前的左端点i是目前区间的最大chargeTimes,则要弹出队列的最前端元素
                if(qu.front()==i) qu.pop_front();
                //修改sum
                sum-=runningCosts[i++];
            }
            //更新符合要求的最大区间
            ans=max(ans,j-i+1);
        }
        return ans;
    }
};

标签:qu,chargeTimes,窗口,long,ans,滑动,LeetCode,2398,nice
From: https://blog.csdn.net/weixin_46028214/article/details/142218736

相关文章

  • 【LeetCode Hot 100】2. 两数相加
    题目描述题目手下留情给出的链表使用逆序表示加数,因此我们可以从链表头开始逐位相加。我总结了一下有几点需要注意:显然加法需要注意进位,此外需要格外注意的是最后一位没有加数时,还需要考虑进位是否被置位,如果最后的进位为1,我们还需要创建一个新的节点。当其中一个链表走完,需要......
  • 【每日一题】LeetCode 2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和
    【每日一题】LeetCode2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和、堆(优先队列))题目描述给定两个整数数组chargeTimes和runningCosts,分别代表n个机器人的充电时间和运行成本。再给定一个整数budget,表示预算。我们需要计算在不超过预算的情况下,最......
  • leetcode刷题day17|二叉树Part05(654.最大二叉树、617.合并二叉树、700.二叉搜索树中的
    654.最大二叉树构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。递归三步曲:1、传入参数,整数数组,数组的开始和结束,返回树的中间节点。2、终止条件:开始大于等于结束,即数组为空。3、递归逻辑:找到最大的元素,记录元素其下标,构建中间节点;递归构造......
  • LeetCode算法—分治法
    思路:分治法的核心思想是“分而治之”,即将一个复杂的问题分成多个较小的子问题,分别求解这些子问题,然后将子问题的解合并,得到原问题的解。具体到求众数的问题上,分治法通过递归地将数组分成两部分,分别找出每一部分的众数,最后通过合并步骤来确定整个数组的众数。LeetCode169多数元素......
  • LeetCode 692.前K个高频单词
    LeetCode692.前K个高频单词C++思路......
  • 力扣刷题——2398. 预算内的最多机器人数目
    由题目中求“最多可以连续运行的机器人数目”可知,求的是数组子数组的长度,那么就可以直接使用滑动窗口求解。配合前缀和,可以快速的求得滑动窗口内的运行时间和。那么编写代码如下:intmaximumRobots(vector<int>&chargeTimes,vector<int>&runningCosts,longlongbudget){......
  • 【LeetCode Hot 100】1. 两数之和
    题目描述显然,最简单和直接的想法是使用暴力枚举:使用双重循环枚举符合条件的下标对并返回。这种方法的时间复杂度是平方级别\(O(N^2)\)。对于每个确定的数x,我们需要找到target-x对应的下标,暴力枚举方法使用的是直接遍历,这个操作的复杂度是线性的,而如果我们使用哈希表将元素及其......
  • VS2019远程调试非公网非局域网的远程,经验nice-(下)
    1.远程目标主机上配置VS2019远程调试工具将VS2019远程调试工具拷贝到远程目标主机上。VS2019远程调试工具:(1)从微软官网下载: VisualStudio2022远程工具,问题是,目前只支持VS2022版本的远程工具。对于VS2019的远程工具,则不提供支持。方式(2)从VS2019安装的文件......
  • 0910-0911 shell编程与基础算法(leetCode )
    栈的定义栈(Stack),也称为堆栈,它是一种特殊的线性表,只允许在表的一端进行插入和删除操作。允许在表操作的一端称为栈顶(Top),另一端称为栈底(Bottom)。栈顶是动态变化的,它由一个称为栈顶指针(top)的变量指示。当表中没有元素时,称为空栈。栈的插入操作称为入栈或进栈,删除操作称为出栈或......
  • LeetCode刷题
    2.11378.使用唯一标识码替换员工ID2.1.1说明Employees表:±--------------±--------+|ColumnName|Type|±--------------±--------+|id|int||name|varchar|±--------------±--------+在SQL中,id是这张表的主键。这张表的每一行分别代表了某......