我正在处理此问题:检查数组是否为Bean数组。如果满足以下条件,则将数组定义为Bean数组:如果包含9,则还包含13。如果包含7,则不包含16。
我尝试了两种解决方法。但我不确定就“时空复杂度”或与Big O相关而言,哪种代码更有效。
这是我写的两种方式:
static int isBean2(int[] a)
{
for(int i=0;i<a.length;i++) {
if(a[i]==9){
for(int j=0;j<a.length;j++){
if(a[j]==13)
break;
if(j==a.length-1 && a[j]!=13)
return 0;
}
}
if(a[i]==7) {
for(int k=0;k<a.length;k++)
if(a[k]==16)
return 0;
}
}
return 1;
}
}
static int isBean(int[] a)
{
int n=0;
int t=0;
int seven=0;
int sixteen=0;
for(int i=0; i<a.length;i++){
if(a[i]==9)
n=1;
if(a[i]==13)
t=1;
if(a[i]==7)
seven=1;
if(a[i]==16)
sixteen=1;
}
if(n==1 && t==0)
return 0;
if(seven==1 && sixteen==1)
return 0;
return 1;
}
第二个代码似乎很愚蠢,但是,请问有更好答案的人吗?
答案 0 :(得分:2)
第一种解决方案的最坏情况复杂度为O(n ^ 2),而第二种解决方案的复杂度为O(n),但根据上述要求是错误的。
对于第二种解决方案,您可以在循环结束后进行以下更正:
if ((n == 1 && t == 1) || (seven == 1 && sixteen == 0))
return 1;
return 0;
答案 1 :(得分:0)
解决方案2仅具有1 for循环,这意味着它具有O(n)效率,而解决方案1具有O(n ^ 2),因为它具有嵌套的for循环。这是因为内部for循环将代码运行a.length(n)次,外部for循环将内部循环运行a.length(n)次,从而使嵌套的for循环效率为O(n ^ 2)。
您对第二段代码的更正如上文Vatsal Jain所述
if ((n == 1 && t == 1) || (seven == 1 && sixteen == 0))
return 1;
return 0;
假定返回值为1是一个bean数组。