使库存平衡的最少丢弃次数
用哈希表统计当前窗口内每种物品的保留次数; 遍历每天的物品: 先尝试保留当前物品,若保留后该物品次数超过m,则丢弃 当遍历天数超过w时,滑动窗口左边界,移除i-w+1天的物品,减少其计数。
class Solution {
public:
int minArrivalsToDiscard(vector<int>& arrivals, int w, int m) {
int ans = 0;
unordered_map<int, int> cnt; // 统计当前窗口内每种物品的保留次数
for (int i = 0; i < arrivals.size(); i++) {
int &x = arrivals[i];
cnt[x]++; // 先尝试保留当前物品,计数+1
// 若当前物品在窗口内的次数超过m,必须丢弃
if (cnt[x] > m) {
cnt[x]--;
x = 0; // 标记为丢弃
ans++; // 丢弃次数+1
}
if (i < w - 1) {
continue;
}
// 滑动窗口左边界:移除w天前的物品计数
cnt[arrivals[i - w + 1]]--;
}
return ans;
}
};
时间复杂度: O(n)
