力扣3679. 使库存平衡的最少丢弃次数
这一题的大意是在第i天和最近的max(1,i-w+1)天中的物品,如果超过了m次,那么就必须被丢弃,只能丢弃当天的物品。
很明显是维护一个滑动窗口,在窗口内如果有物品超过了m,就把当天的丢弃,并需要把这个物品标记成已经丢弃的状态,因为在滑动窗口发生变换的时候,左边的边界往前移动的时候,会丢掉原来的左边界,而原来的边界可能是已经被丢掉过的,会重复丢弃,因此应该对丢弃的物品作标记。
完整代码如下:
class Solution {
public:int minArrivalsToDiscard(vector<int>& arrivals, int w, int m) {int ans=0;unordered_map<int,int> mp;for(int i=0;i<arrivals.size();i++){if(i+1-w+1>1&&arrivals[i+1-w+1-2]!=0){mp[arrivals[i+1-w+1-2]]--;}mp[arrivals[i]]++;if(mp[arrivals[i]]>m){ans++;mp[arrivals[i]]--;arrivals[i]=0;}}return ans;}
};
总结:题目是滑动窗口的模板题,但唯一需要注意的一点就是已经丢掉的物品,我们要对它进行标记,标记为0,否则在左窗口发生移动的时候,会把它重复丢弃。
本质还是要理解清题意。