Acm学习总结15
这次总结的是单调序列,其实这个所谓的单调序列并没有用到队列的知识,一个单调序列可以是递增的还有递减的,比如说一个递增的队列,1,3,2,1,5,6这么一组数。
1入队列然后3入队列,然后就是2入队列但是队尾的数字比新插入的元素还要大所以,为了保持不减的的数列所以需要把3踢出去所以最后得到的就是最前面的就是最小的数
其中有一道题就是:
滑动的窗口;其实用传统的方法就是一个双重循环就能解决这个问题,但是复杂程度就是n的平方;
重要的部分
int a[M],Q[M],I[M];
int i,n,k;
void getMin(){
int head=1,tail=0;
for(i=1;i<k;i++){
while(head<=tail&&Q[tail]>=a[i])tail–;
tail++;
Q[tail]=a[i];I[tail]=i;
}
for(i=k;i<=n;i++){
while(head<=tail&&Q[tail]>=a[i])tail–;
tail++;
Q[tail]=a[i];I[tail]=i;
while(I[head]<=i-k) head++;
printf("%d ",Q[head]);
}
}
还有求最大值就是跟这个相反就行了;
这次总结也就是这些了
Acm学习总结15
最新推荐文章于 2024-02-25 18:23:11 发布