用哈希表统计当前窗口内每种物品的保留次数; 遍历每天的物品: 先尝试保留当前物品,若保留后该物品次数超过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)