总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】
题目:
滑动窗口的最大值
给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为{4,4,6,6,6,5}。
解题思路:
1.这个题目需要使用双向队列deque来进行解答。
2.注意双向队列中存的不是数值,而是下标。
可以AC的解法【C++版本】
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
vector<int> maxInWindows(const vector<int>& num, unsigned int size);
int main() {
vector<int> data{2,3,4,2,6,2,5,1};
vector<int> resu = maxInWindows(data, 3);
for (auto a : resu) {
cout << a << endl;
}
system("pause");
return 0;
}
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> resu;
if (num.size() >= size && size >= 1) {
deque<int> numDeque;
//首先把前size个数按照规则压入双向队列
for (int i = 0; i != size; i++) {
while (!numDeque.empty() && num[i] >= num[numDeque.back()]) {
numDeque.pop_back();
}
numDeque.push_back(i);
}
//压入第一个最大值
//滑动窗口的最大值总是位于双向队列的头部
resu.push_back(num[numDeque.front()]);
for (int i = size; i != num.size(); i++) {
//首先按照规则压入新的值
while (!numDeque.empty() && num[i] >= num[numDeque.back()]) {
numDeque.pop_back();
}
//并且删除旧值,即滑出了窗口的值
if (!numDeque.empty() && numDeque.front() <= static_cast<int>(i - size)) {
numDeque.pop_front();
}
numDeque.push_back(i);
resu.push_back(num[numDeque.front()]);
}
}
return resu;
}