首页 > 编程知识 正文

限流滑动窗口算法概念,滑动窗口的最大值

时间:2023-05-04 07:28:02 阅读:16154 作者:2494

3359 blog.csdn.net/QQ _ 36426073/article/details/90203633

实例1052 .脾气暴躁的书店老板今天,书店老板有家店想试营业customers.length分钟。 每分钟,几个顾客(customers[i] )都会进入书店。 这些顾客都在那部分结束后离开。

有一次,书店老板生气。 如果书店老板在第I分钟生气,grumpy[i]=1,否则grumpy[i]=0。 书店老板生气的话,顾客就会相应地不满,如果不生气,他们就会满足。

书店老板知道抑制自己感情,避免连续x分钟生气的秘密技巧,但只能使用一次。

请在这一天回来营业。 最多有多少客户满意?

解法后缀和滑动窗口的想法:总和分为前后两个部分a和b。 a的部分是从0到位置I的扫描和。 b的部分是来自位置i 1的后缀和。 求出A B的最大和即可。

示例: customers=[ 1,0,1,2,1,1,7,5 ],grumpy=[ 0,1,0,1,0,1,0,1 ],X=3

后缀和S=[ 10 9 9 8 8 7 7 0 ]

那么,B=S[i 1]。

用滑动窗求出a部分。 当窗口向右滑动时,将窗口中的值相加,并减去窗口中的值。

总体想法:

求后缀和s; W=0; 窗口值ans=0; 结果for(In ) if (IX ) W =位置I的客户数; else{ W =进入窗口的顾客数; W -=离开窗口的客户数}ans=max(ans,W S[i 1]; )解法二滑动窗构想:结果分为两部分。 不生气时的人数必须全部加起来。 此时,在窗户中,求出生气时的最大人数之和即可。 用滑动窗法求出窗户中生气时的最大人数和。

示例: customers=[ 1,0,1,2,1,1,7,5 ],grumpy=[ 0,1,0,1,0,1,0,1 ],X=3

不生气的位置[ 1,0,http://www.Sina.com /,2,http://www.Sina.com /,1,http://www.Sina.com /,5

不生气的总人数=1 1 1 7=10

窗口中生气的人的最大位置[ 1,0,1,2,1,http://www.Sina.com/]

在窗口生气的最多人数和=1 5=6

想法:

W=0; 窗口值; max_W=0; 最大窗口值; ans=0; 结果值; for(In ) if (不生气) ans =人数; else W =进入窗口生气的人数; if(I=x ) w-=出窗生气的人数}max_w=max(max_w,w ); }ans max_W是结果; 初始版本:

intmax satisfied (vectorintcustomers,vectorint grumpy,int X ) ({ int s=customers.size ); int sum=0; int maxdiff=0; int ans=0; for(intI=0; is; I ) sum=(! gumpy[I]*customers[I]; int curr=0; for(intI=0; iX; I ) curr=grumpy[i]*customers[i]; maxdiff=curr; for(intI=x; is; I ) curr=grumpy [ I ] * customers [ I ]-grumpy [ I-x ] * customers [ I-x ]; maxdiff=max(curr,maxdiff ); }返回和最大值; }; intmax satisfied (vectorintcustomers,vectorint grumpy,int X ) { const int N=grumpy.size; int W=0; int ans=0; int max_W=0; for(intI=0; iN; I ) if (! gumpy [ I ] (ans=客户[ I ]; else W =grumpy[i]? [ I ] : 0; if(I=x ) { W -=grumpy[i-X]? [ I-x ] : 0; }max_w=max(max_w,w ); } return ans max_W; }自己的:

类解决方案{ public : intmax satisfied (vectorintcustomers,vectorint grumpy,int X ) { int satisfyNum=0; //int unsatisfyNum=0; //放入循环,每次初始化int length=customers.size (; int maxunsatufy=0; int window=0; //初始窗口值//step 1、正常时的满足客户总数和初始窗口数for(intI=0; ilength; I ) if(grumpy[I]==0) satisfyNum =customers[i]; elseif(grumpy[I]==1IX ) /窗口初始条件({ window =customers[i]; } } maxunsatufy=window; //这里有臭虫! 如果不添加这个词的话//step 2,用滑动法求窗口的变更,求最大窗口值移动//窗口的时候,出去的东西生气了就关掉! 进来是生气的话就加! 不生气的话,就不影响for (inti=x; ilength; I () if ) grumpy[I]==1) /如果进来很生气,window =customers[i]; if(grumpy(I-x )==1) /如果退出是生气的,则删除window-=customers (I-x ) )。 maxunsatufy=max (窗口,maxunsatufy; } return maxunsatufy satisfyNum; }; 错误:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。