2024.4.23
题目来源
我的题解
方法一 滑动窗口
先计算不使用冷静期的总和,然后使用滑动窗口计算每个窗口内使用冷静期后能够增长的满意客户数。
时间复杂度:O( n 2 n^2 n2)
空间复杂度:O(1)
public int maxSatisfied(int[] customers, int[] grumpy, int minutes) {
int all=0;
int n=customers.length;
for(int i=0;i<n;i++){
if(grumpy[i]!=1)
all+=customers[i];
}
int res=all;
for(int i=0;i<=n-minutes;i++){
int sub=0;
for(int j=i;j<i+minutes;j++){
if(grumpy[j]==1){
sub+=customers[j];
}
}
res=Math.max(res,all+sub);
}
return res;
}
方法二 滑动窗口+前缀和
对于滑动窗口内的计算可以使用一个前缀和数组来实现O(1)的时间复杂度。
时间复杂度:O(n)
空间复杂度:O(n)
public int maxSatisfied(int[] customers, int[] grumpy, int minutes) {
int n = customers.length;
int[] prefixSum = new int[n + 1];
int all = 0;
int res = 0;
// 计算前缀和数组,同时更新all为所有不生气顾客的满意度总和
for (int i = 0; i < n; i++) {
prefixSum[i + 1] = prefixSum[i] + (grumpy[i] == 1 ? customers[i] : 0);
all += (grumpy[i] == 0 ? customers[i] : 0);
}
// 使用滑动窗口找出在任何连续minutes分钟内生气顾客的满意度总和
for (int i = 0; i + minutes <= n; i++) {
// 计算当前窗口内生气顾客的满意度总和
int satisfied = prefixSum[i + minutes] - prefixSum[i];
// 更新结果res为当前窗口的总满意度和all加上当前窗口内生气顾客的满意度
res = Math.max(res, all + satisfied);
}
return res;
}
方法三 滑动窗口+前缀和
官方题解的巧妙计算。
时间复杂度:O(n)
空间复杂度:O(n)
public int maxSatisfied(int[] customers, int[] grumpy, int minutes) {
int total = 0;
int n = customers.length;
for (int i = 0; i < n; i++) {
if (grumpy[i] == 0) {
total += customers[i];
}
}
int increase = 0;
for (int i = 0; i < minutes; i++) {
increase += customers[i] * grumpy[i];
}
int maxIncrease = increase;
for (int i = minutes; i < n; i++) {
increase = increase - customers[i - minutes] * grumpy[i - minutes] + customers[i] * grumpy[i];
maxIncrease = Math.max(maxIncrease, increase);
}
return total + maxIncrease;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~