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

滑动窗口的最大值

/* 双端队列实现滑动窗口最大值的输出
   如果双端队列不为空,并且双端队列尾部的值小于或等于当前数组中的值,
   双端队列弹出尾部值,否则直接压入双端队列的尾部, 
   如果滑过窗口的长度大于等于窗口长度,双端队列前端的值压入返回数组,
   判断双端队列是否超出长度限制,超出从前端弹出
    */
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;
	}
};

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

发布了57 篇原创文章 · 获赞 13 · 访问量 2131
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览