栈和队列常见算法实现(三)

滑动窗口的最大值

/* 双端队列实现滑动窗口最大值的输出
   如果双端队列不为空,并且双端队列尾部的值小于或等于当前数组中的值,
   双端队列弹出尾部值,否则直接压入双端队列的尾部, 
   如果滑过窗口的长度大于等于窗口长度,双端队列前端的值压入返回数组,
   判断双端队列是否超出长度限制,超出从前端弹出
    */
class SlideWindow {
    
    
public:
	vector<int> getMax(vector<int>& arr, int len) {
    
    
		if (arr.empty() || len <= 0 || arr.size() < len) {
    
    
			return vector<int>();
		}
		deque<int> dq;
		vector<int> res;
		for (int i = 0; i < arr.size(); i++) {
    
    
			while (!dq.empty() && arr.at(dq.back()) <= arr.at(i)) {
    
    
				dq.pop_back();
			}
			dq.push_back(i);
			if (i >= (len - 1)) {
    
    
				res.push_back(arr.at(dq.front()));
				if (i - len + 1 >= dq.front()) {
    
    
					dq.pop_front();
				}
			}
		}
		return res;
	}
};

如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢

猜你喜欢

转载自blog.csdn.net/xiao_ma_nong_last/article/details/105113149