《从头再来》剑指offer.59I 滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
同样的借助双端队列来完成目标。双端队列用于保存当前窗口中的最大值,和最大值后边的比他小的值。如果移动窗口,则首先删除双端队列的队头元素,再添加元素。如果滑动窗口新添加的元素大于双端队列中现存的所有元素,则双端队列只保存这个最大的元素。
class Solution { public: //必须定义一个类,重写函数才可以 class MyQueue{ public: deque<int> deq; //入队--只入当前滑动窗口的最大值,以及后面的小值;如果滑窗移动,必须保证当前队列的头元素为滑窗最大值 void push(int val){ while(! deq.empty() && deq.back() < val) deq.pop_back(); deq.push_back(val); } //出队--如果队列的头元素等于出滑窗的元素,则删除队列头元素,否则不做任何操作 void pop(int val){ if(deq.front() == val) deq.pop_front(); } //取最大值 int front(){ return deq.front(); } }; vector<int> maxSlidingWindow(vector<int>& nums, int k) { //一定要创建对象 MyQueue deq; vector<int> result; if(nums.empty()) return result; //先将前k个元素入队 for(int i = 0; i < k; ++i){ deq.push(nums[i]); } result.push_back(deq.front());//取得第一个滑窗的最大值 //滑窗移动 for(int i = k; i < nums.size();++i){ deq.pop(nums[i-k]);//删除 deq.push(nums[i]);//增添 result.push_back(deq.front());//滑窗动一次去一次最大值 } return result; } };
所有的解释都在代码里了,以上。
《从头再来》

浙公网安备 33010602011771号