时间复杂度对比
问题:
有一个书店老板,他的书店开了 n
分钟。每分钟都有一些顾客进入这家商店。给定一个长度为 n
的整数数组 customers
,其中 customers[i]
是在第 i
分钟开始时进入商店的顾客数量,所有这些顾客在第 i
分钟结束后离开。
在某些时候,书店老板会生气。 如果书店老板在第 i
分钟生气,那么 grumpy[i] = 1
,否则 grumpy[i] = 0
。
当书店老板生气时,那一分钟的顾客就会不满意,若老板不生气则顾客是满意的。
书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 minutes
分钟不生气,但却只能使用一次。
请你返回 这一天营业下来,最多有多少客户能够感到满意 。
示例 1:
输入:customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], minutes = 3 输出:16 解释:书店老板在最后 3 分钟保持冷静。 感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.
示例 2:
输入:customers = [1], grumpy = [0], minutes = 1 输出:1
代码1
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>customers {1,0,1,2,1,1,7,5};
vector<int> grumpy {0,1,0,1,0,1,0,1};
int minutes =3;
int l=0;
int r=minutes;
int n=grumpy.size();
int res=0;
while(r<=n)
{
int temp=0;
for(int i=r;i<n;i++)
{
if(grumpy[i]==0)
{
temp+=customers[i];
}
}
for(int i=0;i<l;i++)
{
if(grumpy[i]==0)
{
temp+=customers[i];
}
}
for(int i=l;i<r;i++)
{
temp+=customers[i];
}
l++;
r++;
res=max(res,temp);
}
cout<< res;
}
用了两重循环,时间复杂度是O(n^2),当数量很多的时候时间开销很大。
代码2
class Solution {
public:
int maxSatisfied(vector<int>& customers, vector<int>& grumpy, int minutes) {
int n=grumpy.size();
int basic=0;
int increase=0;
int Increase=0;
int res=0;
for(int i=0;i<n;i++)
{
if(grumpy[i]==0)
{
basic+=customers[i];
}
}
for(int i=0;i<minutes;i++)
{
increase+=grumpy[i]*customers[i];
}
Increase=increase;
for(int i=minutes;i<n;i++)
{
increase=increase-grumpy[i-minutes]*customers[i-minutes]+grumpy[i]*customers[i];
Increase=max(increase,Increase);
}
res=basic+Increase;
return res;
}
};
先找到不用秘密技巧时顾客满意数量,再找出使用技巧后增加的满意顾客数量的最大值,这里滑动窗口的移动只用了一重循环,通过原始窗口中increase的数量减去左侧边界(不再受影响),加上右侧边界(即将受影响)来控制窗口的移动,并更新Increase的最大值,时间复杂度将为了O(n).