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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值