LeetCode 启动!
每日一题的题解重新开始连载!
题目:预算内的最多机器人数目
题目链接:2398. 预算内的最多机器人数目
题目描述
代码与解题思路
func maximumRobots(chargeTimes []int, runningCosts []int, budget int64) (ans int) {
l, sum, mx := 0, 0, []int{0}
for r := range chargeTimes {
// 求 k 个机器人中最大充电时间,单调队列维护一下
for len(mx) > 0 && mx[len(mx)-1] < chargeTimes[r] {
mx = mx[:len(mx)-1]
}
mx = append(mx, chargeTimes[r])
// k 个机器人的运行时间之和,直接累加
sum += runningCosts[r]
for len(mx) > 0 && int64(mx[0] + (r-l+1)*sum) > budget { // 维护滑窗
if chargeTimes[l] == mx[0] { // 注意是遇到单调队列中的最大值才出队列
mx = mx[1:]
}
sum -= runningCosts[l]
l++
}
ans = max(ans, r-l+1)
}
return ans
}
这道题是一道经典的滑动窗口题目,题目要求找预算内连续的最多的机器人数目,然后给了一个公式:max(chargeTimes) + k * sum(runningCosts),简洁明了,直接根据这个公式用滑窗即可
求 sum 容易,直接累加就行,怎么灵活维护一个子数组的最大值呢?这就需要用到单调队列,通过单调队列实时维护当前子数组的最大值,能够很方便的对子数组的最大值进行删改
最后记录下最多的机器人数目并返回即可
视频实况(包含往期每日一题,可能会有讲解)
视频链接:【【LeetCode】每日一题 2024_9_13 预算内的最多机器人数目(滑动窗口、单调队列)】