首页 > 其他分享 >滑动窗口+单调队列

滑动窗口+单调队列

时间:2024-09-13 20:03:28浏览次数:11  
标签:窗口 chargeTimes 队列 res int 滑动 单调

题目:

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

答案:

# from typing import List
# from collections import deque
class Solution:
    def maximumRobots(self, chargeTimes: List[int], runningCosts: List[int], budget: int) -> int:
        res, n, runningCostSum = 0, len(chargeTimes), 0
        q, i = deque(), 0
        for j in range(n):
            runningCostSum += runningCosts[j]
            # 维护q,保证它递减
            while q and chargeTimes[q[-1]] <= chargeTimes[j]:
                q.pop()
            q.append(j)
            # i==j还进入循环,说明这里一个都不行,i会变成i+1退出循环,cost都会被清空
            while i <= j and (j - i + 1) * runningCostSum + chargeTimes[q[0]] > budget:
                # 如果i是目前最大的,只需移除它即可,有j作为保障
                if q and q[0] == i:
                    q.popleft()
                runningCostSum -= runningCosts[i]
                i += 1
            res = max(res, j - i + 1)
        return res

''' 滑动窗口、双指针
关键是用q来维持chargeTime最大值
每次j向后移,都会将j加入,同时清除j前面比j小的,这就保证了队列里的charge是递减的,
当某次i需要向后移,且i就是最大charge时,直接删掉这一个q就行,后面一定有第二大或者最后加的j
'''

总结:

  1. 滑动窗口就是这样一个数组,j逐个往后增,每轮对i按要求进行左右移动,不断重复此过程
  2. 滑动窗口里的最大最小值,关键是用单调队列,j又一定会添加进去,保证无论i怎么变,都能直接找到下一个最值

标签:窗口,chargeTimes,队列,res,int,滑动,单调
From: https://www.cnblogs.com/faf4r/p/18412804

相关文章

  • (nice!!!)LeetCode 2398. 预算内的最多机器人数目(队列、滑动窗口)
    题目:2398.预算内的最多机器人数目思路:双端队列+滑动窗口。因为需要找连续的机器人,这里就需要用到滑动窗口。细节看注释,时间复杂度0(n)。classSolution{public:intmaximumRobots(vector<int>&chargeTimes,vector<int>&runningCosts,longlongbudget){......
  • 【每日一题】LeetCode 2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和
    【每日一题】LeetCode2398.预算内的最多机器人数目(滑动窗口、数组、二分查找、前缀和、堆(优先队列))题目描述给定两个整数数组chargeTimes和runningCosts,分别代表n个机器人的充电时间和运行成本。再给定一个整数budget,表示预算。我们需要计算在不超过预算的情况下,最......
  • 滑动窗口(3)_最大连续1的数组个数III
    个人主页:C++忠实粉丝欢迎点赞......
  • Team Queue(队列)
    #include<bits/stdc++.h>usingnamespacestd;#definexfirst#defineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvector<string>VS;typedefvector<int>......
  • HISTOGRA - 最大矩形面积(单调栈)
    include<bits/stdc++.h>usingnamespacestd;definexfirstdefineysecondtypedefpair<int,int>PII;typedeflonglongll;typedefunsignedlonglongull;typedefunsignedintuint;typedefvectorVS;typedefvectorVI;typedefvector<vect......
  • 解决rabbitmq队列超时timeout问题【win环境】
    解决rabbitmq队列超时timeout问题【win环境】1.安装RabbitMQ-PluginscdC:\ProgramFiles\RabbitMQServer\rabbitmq_server-3.11.3\sbinrabbitmq-pluginsenablerabbitmq_management浏览器打开http://localhost:15672来访问web端的管理界面,用户名:guest,密码:guest进入管理......
  • DrissionPage解决滑动验证
    之前爬取某数据统计平台时遇到了相当严重的反爬机制,采用普通的Selenium也无法绕过。之前尝试过undetected_chromedriver可以使用,但无法设置无头模式,使用起来还是有一定的不美观性。正好近日学习了DrissionPage这款相当高效的工具,顺手掏出这个项目重构了一下。填输入数据相当简......
  • 【oj刷题】滑动窗口篇:滑动窗口的应用场景和注意事项
    前言:滑动窗口其实基本原理还是双指针,但在双指针中左右指针可能会有回退操作,而滑动窗口的左右指针只会向前走,不会回退,下面就来讲解一下滑动窗口的概念和具体操作(主要是例题讲解)目录一、什么是滑动窗口?二、滑动窗口的原理三、滑动窗口的算法实现四、滑动窗口的例题讲解......
  • 数据结构——队列
    1、定义从栈的学习我们知道栈是只允许在一端进行插入或删除操作的线性表。而队列:是只允许在一端进行插入在另一端删除的线性表。在生活中比如说到饭堂排队打饭,一端进一端出,这就是队列。2、队列顺序实现2.1、队列的基本形式typedefintElemtype;//需要时可以改为自己需要......
  • 等待唤醒机制和阻塞队列
     1.等待唤醒机制由于线程的随机调度,可能会出现“线程饿死”的问题:也就是一个线程加锁执行,然后解锁,其他线程抢不到,一直是这个线程在重复操作voidwait()当前线程等待,直到被其他线程唤醒voidnotify()随机唤醒单个线程voidnotifyAll()唤醒所有线程等待(wa......