zoukankan      html  css  js  c++  java
  • 模板

    一道例题,给定一串数字,求每连续k个数字的最大、最小值。

    思路:初始化一个初始长度为k的单调队列,按从左到右加入元素,同时满足这个队列中的元素是递减的(也就是假如某个数被两个距离不超过k的大于他的数夹着,他会被从队尾调出队列)。得到最大值。

    向右移动一格,假如队首离开范围,出队。往队尾加入元素前,把队尾的所有比它小的元素全部出队。

    得到新的最大值。

    #include<bits/stdc++.h>
    using namespace std;
    
    struct Monotone_Queue{
        deque<int> q;
    
        void push(int value){
            while(!q.empty()&&q.back()<value){
                q.pop_back();
            }
            q.push_back(value);
        }
    
        int front(){
            return q.front();
        }
    
        void pop(){
            q.pop_front();
        }
    };
    
    struct Monotone_Stack{
        stack<int> s;
    
        void push(int value){
            while(!s.empty()&&s.top()<value){
                s.pop();
            }
            s.push(value);
        }
    
        int top(){
            return s.top();
        }
    
        void pop(){
            s.pop();
        }
    };
  • 相关阅读:
    设计模式-抽象工厂模式
    设计模式-工厂方法模式
    设计模式-单例
    java集合-补充HashMapJDK1.8
    java多线程-线程池
    java-阻塞队列
    java多线程-信号量
    java多线程-读写锁
    java多线程-锁
    Ubuntu下编译Poco库
  • 原文地址:https://www.cnblogs.com/Yinku/p/10472977.html
Copyright © 2011-2022 走看看