今天在做这道题的时候,有了一点对一些题max函数min函数就会超时的思考,不是每道题都这样,但也可以是个做题小tips;
题目连接:登录—专业IT笔试面试备考平台_牛客网
题目很简单,用个前缀和暴力一下就行,但不是最优解,会超时
我最开始的代码如下:
#include<bits/stdc++.h>
using namespace std;
#define PII pair<string,string>
const int N = 1e6;
int a[N],sum[N];
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]%=7;
sum[i]=a[i]+sum[i-1];
}
int ans=-1,flag=0;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if((sum[j]-sum[i-1])%7==0){
ans=max(j-i+1,ans);
flag=1;
}
}
}
if(flag==1)cout<<ans;
else cout<<-1;
}
在这个代码中,我在每个能被7整除的区间都进行了一次max判断,本来就是O(n2)的复杂度,可能有很多被7整除的情况,都要进入 if((sum[j]-sum[i-1])%7==0){
ans=max(j-i+1,ans);
flag=1;
}
中进行max比较,从而加大了处理次数,这道题也是超时了。
修改代码如下:
#include<bits/stdc++.h>
using namespace std;
#define PII pair<string,string>
const int N = 1e6;
int a[N],sum[N];
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]%=7;
sum[i]=sum[i]+a[i-1];
}
int maxx=-1,flag=0;
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
int t=j-i+1;
if(t>=maxx){
if((a[j]-a[i-1])%7==0){
maxx=t;
flag=1;
}
}
}
}
if(flag==1)cout<<maxx;
else cout<<-1;
return 0;
}
很明显,我把没有比之前最大值大的数直接pass掉,不进入是否被7整除的区间判断,从而减小了处理次数。
综上所述:尽量不要偷懒,暴力用max或者min函数进行判断,会增加很多没必要的处理次数,有时候就是因为这个会卡着你过不去,所以可以直接定义一个变量进行与当前值比大小的判断,节省了用max函数或者min函数。