题目一:滑动窗口的最大值
题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{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;
}