哪个更昂贵:使用变量或使用for循环而不是声明变量来保存临时结果?

时间:2019-07-18 14:23:53

标签: java time-complexity big-o

我正在处理此问题:检查数组是否为Bean数组。如果满足以下条件,则将数组定义为Bean数组:如果包含9,则还包含13。如果包含7,则不包含16。

我尝试了两种解决方法。但我不确定就“时空复杂度”或与Big O相关而言,哪种代码更有效。

这是我写的两种方式:

1

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;
    }
}

2

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;
}

第二个代码似乎很愚蠢,但是,请问有更好答案的人吗?

2 个答案:

答案 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数组。