classSolution{publicintmaxSatisfied(int[] customers,int[] grumpy,int minutes){int len = customers.length;// 前缀数组int[] leftArr =newint[len];int sum =0;for(int i =0; i < len; i++){if(grumpy[i]!=1){
sum += customers[i];}
leftArr[i]= sum;}// 后缀数组int[] rightArr =newint[len];
sum =0;for(int i = len -1; i >=0; i--){if(grumpy[i]!=1){
sum += customers[i];}
rightArr[i]= sum;}int res =0;// 定义双指针, 滑动窗口int l =0, r = minutes -1;while(r < len){int leftSum = l ==0?0: leftArr[l -1];int rightSum = r == len -1?0: rightArr[r +1];int midSum =0;for(int i = l; i <= r; i++){
midSum += customers[i];}
res =Math.max(res, leftSum + rightSum + midSum);
l++;
r++;}return res;}}
双指针
classSolution{publicintmaxSatisfied(int[] customers,int[] grumpy,int minutes){int len = customers.length;int res =0;// 处理原数组, 将不生气的直接加入res,并把原数组元素置零for(int i =0; i < len; i++){if(grumpy[i]!=1){
res += customers[i];
customers[i]=0;}}// 转换问题为:寻找minutes长度滑动窗口内最大值int max =0, midSum =0;for(int i =0; i < len; i++){if(i >= minutes){
midSum -= customers[i - minutes];}
midSum += customers[i];
max =Math.max(max, midSum);}return res + max;}}