zoukankan      html  css  js  c++  java
  • 滑动窗口的最大值

    1. 概述

    有好几种解法,比较常规的有2中,1是单调队列,队首存放最值。2是优先队列,top也是存放的最值。

    2. 优先队列

    class Solution {
    public:
        vector<int> maxSlidingWindow(vector<int>& nums, int k) {
          int n = nums.size();
            // 存放值 和索引
            priority_queue<pair<int,int>> q;
            for (int i = 0; i < k; ++i) {
                q.push({nums[i],i});
            }
            vector<int> ans = {q.top().first};
            for (int i = k; i < n; ++i) {
                q.push({nums[i],i});
                // ,出队
                while (q.top().second <= i-k){
                    q.pop();
                }
                ans.push_back(q.top().first);
            }
            return ans;
    
    
        }
    };
    
    

    直接引用leetcode的题解,priority_queue,默认大根堆,里面放pair, 因为滑动窗口移动的时候,要将index出界的删除(pop),top存放最大值的值和索引。

    先是进k个元素,然后循环的时候 入队, 检测top的index是否<= i-k ,成立的话pop(),将队列的top的值放入vector。

    3. 双端队列

    class Solution {
    public:
        vector<int> maxSlidingWindow(vector<int>& nums, int k) {
            int n = nums.size();
            // 双端队列里面 存放索引
            // top 就是最大值,维护一个单调性
            deque<int> q;
    
            for (int i = 0; i < k; ++i) {
                while (!q.empty() && nums[i]>=nums[q.back()]){
                    // 出队
                    q.pop_back();
                }
                q.push_back(i);
            }
            // 第一个值
            vector<int>  ans= {nums[q.front()]};
            for (int i = k; i < n; ++i) {
                while (!q.empty() && nums[i]>nums[q.back()]){
                    // 出队
                    q.pop_back();
                }
                q.push_back(i);
                while (q.front()<= i-k){
                    q.pop_front();
                }
                ans.push_back(nums[q.front()]);
            }
            return ans;
        }
    };
    
    

    deque里面放索引,值可以通过索引来取值。

    deque本身是单调递减的,队首存放最大值,这是重点。

    先是把k的最大值放到deque里面去,当第一个值,

    然后处理[k,n-1]的值,如果nums[i] 大于队尾的值,则将队尾元素出栈。

    然后再检测队首的索引有没有出界 i-k,如果出界,就队首出栈。最后将队首取出来,拿到元素,放入结果集中。

  • 相关阅读:
    删除CSDN上传图片水印
    Win10任务栏中隐藏/恢复日期显示
    使用idea和gradle编译spring5源码
    错误:找不到或无法加载主类
    判断字符串是否为数字
    mysql根据json数据过滤
    mysql当不存在时插入
    org.apache.xerces.parsers.SAXParser
    mybatis mapper判断if条件写法
    《Java面向对象编程》
  • 原文地址:https://www.cnblogs.com/gqdw/p/14392228.html
Copyright © 2011-2022 走看看