• [ ] 239.滑动窗口最大值 :::info 在线性时间复杂度内解决此题 ::: 代码:(详细注释)
      滑动窗口最大值 - 图1

      1. class Solution {
      2. private:
      3. class MyQueue { //单调队列(从大到小)
      4. public:
      5. deque<int> que; // 使用deque来实现单调队列
      6. // 每次弹出的时候,比较当前要弹出的数值是否等于队列出口元素的数值,如果相等则弹出。
      7. // 同时pop之前判断队列当前是否为空。
      8. void pop(int value) {
      9. if (!que.empty() && value == que.front()) {
      10. que.pop_front();
      11. }
      12. }
      13. // 如果push的数值大于入口元素的数值,那么就将队列后端的数值弹出,直到push的数值小于等于队列入口元素的数值为止。
      14. // 这样就保持了队列里的数值是单调从大到小的了。
      15. void push(int value) {
      16. while (!que.empty() && value > que.back()) {
      17. que.pop_back();
      18. }
      19. que.push_back(value);
      20. }
      21. // 查询当前队列里的最大值 直接返回队列前端也就是front就可以了。
      22. int front() {
      23. return que.front();
      24. }
      25. };
      26. public:
      27. vector<int> maxSlidingWindow(vector<int>& nums, int k) {
      28. MyQueue que;
      29. vector<int> result;
      30. for (int i = 0; i < k; i++) { // 先将前k的元素放进队列
      31. que.push(nums[i]);
      32. }
      33. result.push_back(que.front()); // result 记录前k的元素的最大值
      34. for (int i = k; i < nums.size(); i++) {
      35. que.pop(nums[i - k]); // 滑动窗口移除最前面元素
      36. que.push(nums[i]); // 滑动窗口前加入最后面的元素
      37. result.push_back(que.front()); // 记录对应的最大值
      38. }
      39. return result;
      40. }
      41. };

      分析:
      那么这个维护元素单调递减的队列就叫做单调队列,即单调递减或单调递增的队列。C++中没有直接支持单调队列,需要我们自己来一个单调队列
      滑动窗口最大值 - 图2
      滑动窗口最大值 - 图3