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