剑指Offer——面试题59:队列的最大值

题目一:滑动窗口的最大值

题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为{4, 4, 6, 6, 6, 5}。
解决思路:利用双端队列
步骤 插入数字 滑动窗口 队列的下标 最大值
1 2 2 0(2) N/A
2 3 2,3 1(3) N/A
3 4 2,3,4 2(4) 4
4 2 3,4,2 2(4),3(2) 4
5 6 4,2,6 4(6) 6
6 2 2,6,2 4(6),5(2) 6
7 5 6,2,5 4(6),6(5) 6
8 1 2,5,1 6(5),7(1) 5
#include<iostream>
#include<algorithm>
#include<vector>
#include<deque>
using namespace std;
vector<int> maxInWindows(const vector<int>& num, unsigned int size){
	vector<int> maxInWindows;
	if(num.size()>=size && size>=1){
		deque<int> index;
		
		for(unsigned int i=0;i<size;i++){
			while(!index.empty() && num[i]>=num[index.back()]) index.pop_back();
			
			index.push_back(i);
		}
		
		for(unsigned int i=size;i<num.size();i++){
			maxInWindows.push_back(num[index.front()]);
			
			while(!index.empty() && num[i]>=num[index.back()]) index.pop_back();
			
			if(!index.empty() && index.front()<=i-size) index.pop_front();
			
			index.push_back(i); 
		}
		maxInWindows.push_back(num[index.front()]);
	}
	return maxInWindows;
}
int main() {
	int num[]={2, 3, 4, 2, 6, 2, 5, 1};
	vector<int> vecNumbers(num, num+sizeof(num)/sizeof(int));
	vector<int> result=maxInWindows(vecNumbers, 3);
	for(vector<int>::iterator it=result.begin();it!=result.end();it++){
		printf("%d ", *it);
	}
	return 0;
}

题目二:队列的最大值

题目:请定义一个队列并实现函数 max 得到队列里的最大值,要求函数 max、push_back 和 pop_back 的时间复杂度都是O(1)。
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<cstring>
#include<deque>
#include<stack>
#include<cmath>
using namespace std;
template<typename T> class QueueWithMax{
	public:
		QueueWithMax(): currentIndex(0){} 
		
		void push_back(T number){
			while(!maximums.empty() && number>=maximums.back().number) maximums.pop_back();
			
			InternalData internalData={number, currentIndex};
			data.push_back(internalData);
			maximums.push_back(internalData);
			
			currentIndex++;
		}
		
		void pop_front(){
			if(maximums.empty()) throw new exception();
			
			if(maximums.front().index==data.front().index){
				maximums.pop_front();
			}
			data.pop_front();
		}
		T max() const{
			if(maximums.empty()) throw new exception();
			
			return maximums.front().number;
		}
	private:
		struct InternalData{
			T number;
			int index;
		}; 
		deque<InternalData> data;
		deque<InternalData> maximums;
		int currentIndex;
};
int main() {
	QueueWithMax<int> queue;
	queue.push_back(2);
	queue.push_back(3);
	queue.push_back(4);
	queue.push_back(5);
	printf("%d", queue.max());
	return 0;
}
发布了74 篇原创文章 · 获赞 75 · 访问量 4047

猜你喜欢

转载自blog.csdn.net/qq_35340189/article/details/104496068