1、
直接暴力做的话超时了,而且还要注意很多边界条件,理不太清。。
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {
int n = customers.size();
int res = INT_MIN;
int ans = 0;
int idx = -1;
for(int i = 0; i < n; i++)
{
i =idx + 1;
if(grumpy[i] == 1)
{
idx = i;
for(int j = 0; j < X; j++)
{
if(grumpy[i] == 1)
{
grumpy[i] = -grumpy[i];
}
if(i + 1 < n && X > j +1)
{
i++;
}
}
}
ans = 0;
for(int k = 0; k < n; k++)
{
if(grumpy[k] == 0 || grumpy[k] == -1)
{
ans += customers[k];
if(grumpy[k] == -1)grumpy[k] = -grumpy[k];
}
}
res = max(res,ans);
//i =idx + 1;
}
return res;
}
};
滑动窗口:
直接计算所有的0的时候的值
然后滑动窗口去计算哪一个窗口里面老板不生气最好
一开始计算一个increase代表我最初的窗口可以增加多少,后面就在这个初始窗口上面滑动。。
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int X) {
int total = 0;
int n = customers.size();
for (int i = 0; i < n; i++) {
if (grumpy[i] == 0) {
total += customers[i];
}
}
int increase = 0;
for (int i = 0; i < X; i++) {
increase += customers[i] * grumpy[i];
}
int maxIncrease = increase;
for (int i = X; i < n; i++) {
increase = increase - customers[i - X] * grumpy[i - X] + customers[i] * grumpy[i];
maxIncrease = max(maxIncrease, increase);
}
return total + maxIncrease;
}
};