一、考察知识点
multiset 的使用,meltiset中可以包含重复重复的值,并且插入进去后直接排好序。
具体操作见:(1条消息) multiset学习之迭代器操作begin,cbegin,end,cend,rbegin,crbegin,rend,crend_班公湖里洗过脚的博客-CSDN博客二、代码
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
multiset<int> window;
for (int i = 0; i<nums.size(); ++i){
window.insert(nums[i]);
if (i - k + 1 >= 0){
ans.push_back(*window.rbegin());
window.erase(window.equal_range(nums[i - k + 1]).first);
}
}
return ans;
}
};
这里erase操作会将与该值相等的所有元素删除,但我们希望只删除第一个。multiset中equal_range是使用二分法查找的。
方法二、
class MonotonicQueue{
public:
void push(int element){
while(!data_.empty() && element > data_.back()) data_.pop_back();
data_.push_back(element);
}
void pop(){
data_.pop_front();
}
int max(){
return data_.front();
}
private:
deque<int> data_;
};
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> ans;
MonotonicQueue que;
for ( int i = 0; i < nums.size(); ++i){
que.push(nums[i]);
if (i - k + 1 >=0){
ans.push_back(que.max());
if (nums[i - k + 1] == que.max()) que.pop();
}
}
return ans;
}
};
使用单调队列,队列从头到尾异地递减,新加入的元素如果大于队尾元素则将队尾元素删除,直至队列中没有比新加进来的元素大。