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,如果出界,就队首出栈。最后将队首取出来,拿到元素,放入结果集中。

  • 相关阅读:
    Core Animation Programming Guide
    Core Animation Programming Guide
    Core Animation Programming Guide
    Core Animation Programming Guide
    Core Animation Programming Guide
    Core Animation Programming Guide
    UIScrollView_滚动视图
    Core Animation之基础介绍
    CORE ANIMATION的学习备忘录
    UIWindow & UIWindowLevel笔记
  • 原文地址:https://www.cnblogs.com/gqdw/p/14392228.html
Copyright © 2011-2022 走看看