看了一下所有题解的思路,几乎都是用数据结构完成的,难得一次和所有大佬思路都不一样(且能过),很有必要写篇题解纪念一下。
思路:
    滑动窗口,加投票算法:只需要几个变量来记录当前区间中的最值以及最值的数量,即可实现:
    情况主要分为两部分:第一个区间和后面的所有区间;
    第一个区间需要通过循环来判断当前区间内的最值,以及最值的数量
    后续的每一个区间,只需要判断新进入区间的值是不是比最值更大/小,或者离开区间的值是不是该区间中的唯一最值,即可判断当前区间的最值是否改变
    如果后续区间中出现了最值移出了区间的情况,只需要再进行一次类似第一个区间的循环,再次获得一个初始状态,即可不断重复该过程直至结束
    思路主打的就是一个简单直接,直接上代码!
代码:
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n,k;
    cin>>n>>k;
    vector<int> a(n+1);
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int minNum=2147483647,maxNum=-2147483648,minCount=0,maxCount=0;
    vector<int> minArr,maxArr;
    for(int i=1;i<=n;i++){
        if(i==1){
            for(int j=1;j<=k;j++){
                if(a[j]<minNum){
                    minNum=a[j];
                    minCount=1;
                }
                else if(a[j]==minNum)
                    minCount++;
                if(a[j]>maxNum){
                    maxNum=a[j];
                    maxCount=1;
                }
                else if(maxNum==a[j])
                    maxCount++;
            }
            i=k;
        }
        else{
            if(a[i]<minNum){
                minNum=a[i];
                minCount=1;
            }
            else{
                if(a[i]==minNum)
                    minCount++;
                if(a[i-k]==minNum)
                    minCount--;
                if(minCount==0){
                    minNum=2147483647;
                    for(int j=i-k+1;j<=i;j++){
                        if(a[j]<minNum){
                            minNum=a[j];
                            minCount=1;
                        }
                        else if(a[j]==minNum)
                            minCount++;
                    }
                }
            }
            if(a[i]>maxNum){
                maxNum=a[i];
                maxCount=1;
            }
            else{
                if(a[i]==maxNum)
                    maxCount++;
                if(a[i-k]==maxNum)
                    maxCount--;
                if(maxCount==0){
                    maxNum=-2147483648;
                    for(int j=i-k+1;j<=i;j++){
                        if(a[j]>maxNum){
                            maxNum=a[j];
                            maxCount=1;
                        }
                        else if(a[j]==maxNum)
                            maxCount++;
                    }
                }
            }
        }
        minArr.push_back(minNum);
        maxArr.push_back(maxNum);
    }
    for(int i=0;i<minArr.size();i++)
        cout<<minArr[i]<<' ';
    cout<<endl;
    for(int i=0;i<maxArr.size();i++)
        cout<<maxArr[i]<<' ';
    return 0 ;
}