题目: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