暴力
时间复杂度 O(n*k),空间复杂度O(1)
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> result;
int len = num.size();
if (len == 0 || size < 1 || len < size) return result;
for (int i = 0; i + size - 1 < len; ++i) {
int j = i + size - 1;
int max_val = num[j];
for (int k = j; k >= i; --k) {
max_val = max(num[k], max_val);
}
result.push_back(max_val);
}
return result;
}
};
单调队列
时间复杂度 O(n),空间复杂度O(k)
#include <deque>
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size) {
vector<int> result;
int len = num.size();
if (len == 0 || size < 1 || len < size) return result;
deque<int> dq_idx;
// 初始窗口
for (int i = 0; i < size; ++i) {
while (!dq_idx.empty() && num[i] >= num[dq_idx.back()]) {
dq_idx.pop_back();
}
dq_idx.push_back(i);
}
for (int i = size; i < len; ++i) {
result.push_back(num[dq_idx.front()]);
// 如果当前元素大,则要从后面把比num[i]小的都pop
while (!dq_idx.empty() && num[i] >= num[dq_idx.back()]) {
dq_idx.pop_back();
}
// 将队头过期元素清除
while (!dq_idx.empty() && i - dq_idx.front() >= size) {
dq_idx.pop_front();
}
dq_idx.push_back(i);
}
result.push_back(num[dq_idx.front()]);
return result;
}
};

京公网安备 11010502036488号