• 239. 滑动窗口最大值


    239. 滑动窗口最大值

    给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

    返回 滑动窗口中的最大值

    示例 1:

    输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
    输出:[3,3,5,5,6,7]
    解释:
    滑动窗口的位置                最大值
    ---------------               -----
    [1  3  -1] -3  5  3  6  7       3
     1 [3  -1  -3] 5  3  6  7       3
     1  3 [-1  -3  5] 3  6  7       5
     1  3  -1 [-3  5  3] 6  7       5
     1  3  -1  -3 [5  3  6] 7       6
     1  3  -1  -3  5 [3  6  7]      7
    

    示例 2:

    输入:nums = [1], k = 1
    输出:[1]
    

    提示:

    • 1 <= nums.length <= 105
    • -104 <= nums[i] <= 104
    • 1 <= k <= nums.length

    优先队列解法:

    用vis记录区间数字个数即可

    只有队头元素不在区间内时,pop()一下即可

    否则就取队头元素

    单调队列解法:

    队列中元素是递减的(只保存index

    1. 遇到一个新元素就把队列尾部不大于它的元素都弹出去,并且在尾部压入新元素
    2. 如果队列头部元素超出窗口范围,就弹出头部
    3. 每次头部元素是最大值,输出到结果中即可
    class Solution {
    public:
        map<int, int> ss;
        int vis[20010];
        vector<int> maxSlidingWindow(vector<int>& nums, int k) {
            priority_queue<int> Q;
            int x = 10000;
            memset(vis, 0, sizeof(vis));
            vector<int> ret;
            int p = 0, q = 0;
            while(q < nums.size())
            {
                if(q < k - 1)
                {
                    Q.push(nums[q]);
                    vis[nums[q] + x]++;
                    q++;
                }
                else
                {
                    Q.push(nums[q]);
                    vis[nums[q] + x]++;
                    // cout << p << "  " << q << endl;
                    // cout << Q.size() << endl;
                    while(vis[Q.top() + x] == 0)
                    {
                        Q.pop();
                    }
                    // cout << Q.size() << endl;
                    // cout << "***********" << endl;
                    ret.push_back(Q.top());
                    vis[nums[p] + x]--;
                    p++;
                    q++;
                }
    
    
            } 
            return ret;
        }
    };
  • 相关阅读:
    WEB-INF下的jsp通过servlet中超链接跳转
    WEB-INF下的jsp怎么访问
    迭代器一般用法
    接口深层理解
    java中的接口深层理解
    动态SQL与静态SQL的区别
    TIDB集群部署
    ora-00245报错解决方法
    PostgreSQL 密码验证功能增强
    多台机器之间一键化互信脚本实现
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/16522728.html
Copyright © 2020-2023  润新知