思路
两种思路,第一种建立一个排序哈希表multiset,将区间的数都装入容器中,每次取其中最大值,可以仿函数从大到小排序也可以不写反函数直接it = hash.rbegin(),注意在超过区间删除原有元素的时候要删除迭代器,而不是数值:hash.erase(hash.find(nums[j++]));
这样就会避免所有数值相同的重复元素被删除。 这一种时间空间复杂度都相对较高。
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
multiset<int,greater<int>>hash;
vector<int>res;
for (int i = 0, j = 0; i < nums.size(); i++) {
if (i - j == k) hash.erase(hash.find(nums[j++]));
int x = nums[i];
hash.insert(x);
auto it = hash.begin();
if (i - j == k - 1) res.push_back(*it);
}
return res;
}
};
第二种 使用单调队列,用一个两头队列来维护队列,使得队列是一个单调递减的队列,其中最左边的对应在区间中数值的最大值:
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> q;
vector<int>res;
for (int i = 0; i < nums.size(); i ++) {
if (q.size() && i - k + 1 > q.front()) q.pop_front();
while (q.size() && nums[i] >= nums[q.back()]) q.pop_back();
q.push_back(i);
if (i >= k - 1) res.push_back(nums[q.front()]);
}
return res;
}
};