• 【c++刷题Day2】专题3栈与队列&单调栈与单调队列


    这是C++刷题的Day2
    在这里插入图片描述
    🕋题目描述
    🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀
    An array of size n ≤ 106 is given to you. There is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves rightwards by one position. Following is an example:
    The array is [1 3 -1 -3 5 3 6 7], and k is 3.
    Window position Minimum value Maximum value
    [1 3 -1] -3 5 3 6 7 -1 3
    1 [3 -1 -3] 5 3 6 7 -3 3
    1 3 [-1 -3 5] 3 6 7 -3 5
    1 3 -1 [-3 5 3] 6 7 -3 5
    1 3 -1 -3 [5 3 6] 7 3 6
    1 3 -1 -3 5 [3 6 7] 3 7

    Your task is to determine the maximum and minimum values in the sliding window at each position.
    
    • 1

    Input
    The input consists of two lines. The first line contains two integers n and k which are the lengths of the array and the sliding window. There are n integers in the second line.
    Output
    There are two lines in the output. The first line gives the minimum values in the window at each position, from left to right, respectively. The second line gives the maximum values.
    Sample
    Inputcopy Outputcopy

    8 3
    1 3 -1 -3 5 3 6 7
    
    	
    
    -1 -3 -3 -3 3 3
    3 3 5 5 6 7
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀🚀

    🔑思路

    使用单调队列,维护最大值最小值:
    实时的维护一个单调的内部序列,最后队首就是当前的最小值&最大值

    💯CODE代码:

    #include 
    #pragma GCC optimize(2)
    #define min3 (x , y , z) min (x , min (y , z))
    #define max3 (x , y , z) max (x , max (y , z))
    
    using namespace std ;
    
    typedef long long LL ;
    typedef double LF ;
    typedef pair < int , int > PII ;
    typedef pair < string , int > PSI ;
    const int maxn = 1e6 + 10 ;
    int q[maxn] , a[maxn] , n , k ;
    
    int main () {
    
    
        scanf ("%d%d" , & n , & k) ;
        for (int i = 0; i < n; i++)
            scanf ("%d" , & a[i]) ;
        int hh = 0 , tt = -1 ;
        for (int i = 0; i < n; i++) {
            if (hh <= tt && i - k + 1 > q[hh])
                hh ++ ;
            while (hh <= tt && a[q[tt]] >= a[i])
                tt -- ;
            q[++ tt] = i ;
            if (i >= k - 1)
                printf ("%d " , a[q[hh]]) ;
        }
        puts ("") ;
        hh = 0 , tt = -1 ;
        for (int i = 0; i < n; i++) {
            if (hh <= tt && i - k + 1 > q[hh])
                hh ++ ;
            while (hh <= tt && a[q[tt]] <= a[i])
                tt -- ;
            q[++ tt] = i ;
            if (i >= k - 1)
                printf ("%d " , a[q[hh]]) ;
        }
    
    
        return 0 ;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
  • 相关阅读:
    论文的章节有重复率的要求吗?
    242. 有效的字母异位词
    《安富莱嵌入式周报》第327期:Cortex-A7所有外设单片机玩法LL/HAL库全面上线,分享三款GUI, PX5 RTOS推出网络协议栈,小米Vela开源
    win10怎么修复dns配置?DNS配置错误无法上网怎么解决
    Virtualbox安装安卓模拟器
    网页js实现的各种3D树形结构模型
    (c语言)简易计算器
    Java -- 每日一问:Exception 和 Error 有什么区别?
    Vue知识系列(5)每天10个小知识点
    强连通,奇怪的缩点学习笔记?
  • 原文地址:https://blog.csdn.net/m0_60519493/article/details/126351068