2021-11-03 数据结构与算法学习-滑动窗口

问:今书 店 老 板 有 一 家 店 打 算 试 营 业 cus tomer [s] . length 分 钟 。 每 分 钟 都 有 一 些 顾 客 (cus tomer s [i])会进入书店,所有这些顾客都会在那一分钟结束后离开。 在某些时候,书店老板会生气。如果书店老板在第i分钟生气,那么 grumpy [i]=1,否 则grumpy [i]=0。当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满 意的。 书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续X分钟不生气,但却只 能使用一次。 请你返回这一天营业下来,最多有多少客户能够感到满意的数量。

分析:只需要找到customers[]连续x个值的和最大即可,窗口即为X。遍历从数组0位置到 length-x+1位置,每次右滑动一次且计算窗口内的值,并且选出最大的。

public class bookstory {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
int customers[]= {1,2,1,2,1,1,7,5};//客人每分钟的数量
int grumpy[]= {0,1,0,1,0,1,0,1};//老板的脾气在每分钟的分布
int max_patience=3;//老板忍住不发脾气的最长时间
int max_customer=0;//最多能留下的客人数
int max_patience_customers=0;//最多在耐心值下留下的客人数
int log=0;//
for(int i=0;i<customers.length-max_patience+1;i++)//算出最大耐心范围内客人数量最多的数量
	//与第一个在数组的位置Log
{//三个一个窗口 计算一次右滑一次 并记最大窗口时第一个数的位置为log
	  int sum=0;
	  for(int j=i;j<i+max_patience;j++)
	  {
	  sum=sum+customers[j];
	  }
	  if(max_patience_customers<=sum)
	  {
	  max_patience_customers=sum;
	  log=i;
	  }
}
for(int i=0;i<customers.length;i++)//计算最多客人数
{
	if(log<=i&&i<log+max_patience)//在最大窗口内的算法
	{
		max_customer=max_customer+customers[i];
	}
	else 
		max_customer=max_customer+customers[i]*grumpy[i];
}
System.out.println("最多的客人为:"+max_customer+"个");
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值