题目要求
* 今天,书店老板有一家店打算试营业 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) { int sum=0; for (int j=left;j<right;j++) { sum+=customers[j]; } sums[k++]=sum; left++; } right++; } System.out.println(Arrays.toString(sums)); int max=0,index=0; for(int i=0;i<sums.length;i++) { max=sums[0];
if(sums[index]<sums[i]) { index=i; max=sums[i]; } } System.out.println(max+" "+index);
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 x=3; System.out.println(maxSatisfied(customers,grumpy,x)); } }
|
==正确代码==
package 中等.爱生气的书店老板;
import java.util.Arrays;
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]; } } 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); 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 x=3; System.out.println(maxSatisfied(customers,grumpy,x)); } }
|
总结及感悟:一道题整两个小时,做多了可能会快点,我现在明白了,不能一下手就写代码,得先把思路想明白,我按之前的思路写了一个半小时,做出来但是一些特例情况下是错误的,所以整个思路就废了