Merge pull request #2322 from yunfeidog/master

Update0239滑动窗口最大值:存在单调队列并增加C++单调队列解法
This commit is contained in:
程序员Carl
2023-11-04 16:28:37 +08:00
committed by GitHub

View File

@ -62,9 +62,9 @@ public:
每次窗口移动的时候调用que.pop(滑动窗口中移除元素的数值)que.push(滑动窗口添加元素的数值)然后que.front()就返回我们要的最大值。 每次窗口移动的时候调用que.pop(滑动窗口中移除元素的数值)que.push(滑动窗口添加元素的数值)然后que.front()就返回我们要的最大值。
这么个队列香不香,要是有现成的这种数据结构是不是更香了! 这么个队列香不香,要是有现成的这种数据结构是不是更香了!
**可惜了,没有! 我们需要自己实现这么个队列。** 其实在C++中,可以使用 multiset 来模拟这个过程文末提供这个解法仅针对C++,以下讲解我们还是靠自己实现这个单调队列。
然后再分析一下,队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。 然后再分析一下,队列里的元素一定是要排序的,而且要最大值放在出队口,要不然怎么知道最大值呢。
@ -839,6 +839,28 @@ impl Solution {
} }
``` ```
### C++
使用multiset作为单调队列
多重集合(`multiset`) 用以有序地存储元素的容器。允许存在相等的元素。
在遍历原数组的时候只需要把窗口的头元素加入到multiset中然后把窗口的尾元素删除即可。因为multiset是有序的并且提供了*rbegin(),可以直接获取窗口最大值。
```cpp
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
multiset<int> st;
vector<int> ans;
for (int i = 0; i < nums.size(); i++) {
if (i >= k) st.erase(st.find(nums[i - k]));
st.insert(nums[i]);
if (i >= k - 1) ans.push_back(*st.rbegin());
}
return ans;
}
};
```
<p align="center"> <p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank"> <a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/> <img src="../pics/网站星球宣传海报.jpg" width="1000"/>