当前位置: 首页 > 知识库问答 >
问题:

降低以下程序的时间复杂度

轩辕涵亮
2023-03-14
import java.util.Scanner;
class Special_Pairs{

private static Scanner scan;


public static void main(String [] args) {
    byte t;
    int n;
    scan = new Scanner(System.in);
    t=scan.nextByte();
    int[] a=new int[100000];
    while(t>0)
    {
        int i,j,count=0;
        n=scan.nextInt();
    for(i=0;i<n;i++)
    {
        a[i]=scan.nextInt();
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(((a[i]&a[j])==0)||((a[j]&a[i])==0))
            {
                count++;
            }
        }
    }
    t--;
    System.out.println(count);
    }       
}
}

帮助我减少这个程序的时间复杂性

输出:为每个测试用例输出这样的对的数量。

约束条件:T≤10;N≤100000;A[i]≤1000000

示例输入(明文链接)

共有1个答案

太叔烨霖
2023-03-14

我建议对此进行三个优化。我也修改了代码。

  1. 对于外循环的每次迭代,不必总是从0开始。第二个循环可以从第一个循环的current+1开始。因此不会比较您已经比较过的元素。
  2. 您不需要同时检查(i,j)(j,i)对。如果一个为零,则另一个将始终为零。
  3. 您不需要用固定大小初始化数组。您可以始终读取n的值来初始化它。
import java.util.Scanner;

public class Pairs {
  public static void main(String [] args) {
    Scanner scan = new Scanner(System.in);
    int t = scan.nextInt();
    while(t > 0) {
      t--;
      int count = 0;
      int n = scan.nextInt();
      int a[] = new int[n];
      for(int i = 0; i<n; i++) {
        a[i]=scan.nextInt();
      }
      for(int i = 0; i<n-1; i++) {
        for(int j = i+1; j<n; j++) {
          if((a[i] & a[j])==0)
          {
            count += 2;
          }
        }
      }
      System.out.println(count);
    }
  }
}
 类似资料:
  • 以下代码是竞赛中问题陈述的解决方案。给出的时间限制为1s。该代码在5/7个测试用例中正常工作。对于其他情况,超过了时间限制。如何降低下面代码的时间复杂度? 编辑:问题陈述被定义为返回数字n的值或n/2、n/3、n/4之和,以最大值为准。例如,如果输入为24,则可以进一步减少或交换为12 8 6=26,12可以减少为6 4 3=13。8和6不应减少,因为这可能会降低值。最后的答案是13 8 6=27

  • 问题内容: 我正在研究将RequestDTO发送到Web服务的类。我需要先验证请求,然后再发送。 可以从3个不同的地方发送请求,每个“ requesttype”都有不同的验证规则,例如request1必须具有名称和电话号码,request2必须具有地址,等等) 我有一个DTO,其中包含很长的字段列表(名称,地址,城市,电话号码等),无论请求是哪种类型,DTO都发送相同的消息。 我创建了3种不同的验

  • 下面的代码接受一个整数t,然后再接受3个整数t次,并返回可以同时从两个不同整数中减去1的最大次数,而当只剩下0以上的1个整数时,程序停止。我已经解决了这个问题,但我想降低代码的时间复杂度,但我不知道怎么做。 如何在不使用所有这些增加时间复杂度的循环的情况下获得相同的输出? 编辑:我不想我的代码为我重新编写,这是家庭作业,我想要的是提示和帮助,这样我就可以减少时间复杂性,我不知道怎么做。 编辑2:在

  • 所以,基本上,我想找到第二个数组中的所有元素,它们小于或等于第一个数组的元素。这两个数组都是排序的。我知道解决办法。我不想那样。我只想知道这个程序的时间复杂度,以及我们将如何计算。提前谢谢你。

  • 问题内容: 我有一个接收对象并根据其检测到的对象类型执行某些操作的方法: 如何降低环复杂性?我四处搜寻,但找不到任何有用的资讯。 问题答案: 您不能为此使用面向对象的方法吗?创建具有该方法的接口,然后创建实现所需行为的子类?然后调用将执行适当的行为?

  • 我有以下代码,我需要重构它,以降低复杂性,增加模块化和封装性。我还需要减少ck度量值。 你如何重构这个代码?切换案例是否降低了复杂性?