题目要求
* 今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店, * 所有这些顾客都会在那一分钟结束后离开。 * 在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。 * 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。 * 书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生气,但却只能使用一次。 * 请你返回这一天营业下来,最多有多少客户能够感到满意的数量
思路分析:
不生气总数+窗口滑动过程中被挽留的最大人数
==错误思路:窗口滑动中,最大人数+其他不在窗口范围中的不生气人数 ==
代码如下,注释都有
public class 爱生气的书店老板 {
public static int maxSatisfied(int[] customers,int[] grumpy,int x )
{
int left=0,right=0;
int le=customers.length-x+1;
int[] sums=new int[le];
int k=0;
while(right<=customers.length)
{
if(right-left==x)//并且这几个数加起来max、
{
int sum=0;
for (int j=left;j<right;j++)
{
//sum+=(customers[j]*grumpy[j]);//选择出那几个人然后累加起来
sum+=customers[j];
}
sums[k++]=sum;
left++;
}
right++;
}
System.out.println(Arrays.toString(sums));
//System.out.println("left:"+left+" right:"+right);
//我的想法:求出所有的滑动窗口值sum 放入sum数组中 然后求最大的sum 然后跳过该sum的范围 在其他范围中求 “0”所在的sum
// 累加该sum值得到max 然后发现这个案例行不通,我思路错误了。。。
//int[] customers={4,10,10};
//int[] grumpy={1,1,0};
//int x=2;
int max=0,index=0;
for(int i=0;i<sums.length;i++)
{
max=sums[0];
/* if(sums.length==1)
{
max=sums[0];
index=0;
break;
}*/
if(sums[index]<sums[i])
{
index=i;
max=sums[i];
}
}
System.out.println(max+" "+index);//求出最大值和最大值下标(最大值下标即开始下标left left+x即结束下标
// System.out.println(Arrays.toString(sums));
//选出不在该滑动窗口范围中的不生气人数
for(int i=0;i<index;i++)
{
if(grumpy[i]==0)
{
max+=customers[i];
}
}
for (int i=index+x;i<customers.length;i++)
{
if(grumpy[i]==0)
{
max+=customers[i];
}
}
return max;
}
public static void main(String[] args) {
int[] customers={1,0,1,2,6,7,7,5};
int[] grumpy={0,1,0,1,0,1,0,1};
//int[] customers={4,10,10};错误的案例
//int[] grumpy={1,1,0};
int x=3;
System.out.println(maxSatisfied(customers,grumpy,x));
}
}
正确代码
package 中等.爱生气的书店老板;
import java.util.Arrays;
/**
* Created with IntelliJ IDEA.
*
* @Auther: 风离
* @Date: 2021/02/23/14:56
* @Description:
*/
public class 爱生气的书店老板3 {
public static int maxSatisfied(int[] customers,int[] grumpy,int x )
{
int sum=0;
//先求出不会生气的人数
for(int i=0;i<customers.length;i++)
{
if(grumpy[i]==0)
{
sum+=customers[i];
}
}
//System.out.println(sum);
//找出滑动窗口中会生气的最大人数max
int left=0,right=0,k=0;
int[] sum2s=new int[customers.length-x+1];
while (right<=customers.length)
{
if(right-left==x)
{
int sum2=0;
for(int i=left;i<right;i++)
{
sum2+=customers[i]*grumpy[i];
}
sum2s[k++]=sum2;
left++;
}
right++;
}
Arrays.sort(sum2s);
//System.out.println(Arrays.toString(sum2s));
return sum2s[sum2s.length-1]+sum;
}
public static void main(String[] args) {
int[] customers={1,0,1,2,1,1,7,5};
int[] grumpy= {0,1,0,1,0,1,0,1};
//int[] customers={4,10,10};
//int[] grumpy={1,1,0};
int x=3;
System.out.println(maxSatisfied(customers,grumpy,x));
}
}