降低以下计划的时间复杂度

时间:2015-09-04 19:31:01

标签: time time-complexity reduce

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

帮助我降低此计划的时间复杂度

问题:

您已获得大小为N的整数数组A.您必须报告有序对(i,j)的数量,以便A[i] & A[j]=0。 此处&表示BITWISE AND (i,j)(j,i)被视为不同。

输入:第一行包含T-Number测试用例。每个测试的第一行包含N.下一行包含N个整数 - 第i个整数A [i]。

输出:为每个测试用例输出此类对的数量。

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

样本输入(明文链接)

1 5 41 47 34 40 29

样本输出(明文链接)

2

说明:这些是必需的对(3 5) (5 3)

2 个答案:

答案 0 :(得分:2)

我建议三个优化。我也修改了代码。

  1. 对于外循环的每次迭代,您不必始终从0开始。第二个循环可以从第一个循环的current+1开始。所以不会比较你已经比较过的元素。
  2. 您无需检查对(i,j)(j,i)。如果一个为零,则其他将始终为零。
  3. 您无需使用修复大小初始化阵列。您始终可以使用n
  4. 的值初始化它
    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);
        }
      }
    }
    

答案 1 :(得分:0)

如果您正在参加编程竞赛(如ICPC或类似的竞赛),也许您不应该使用Scanner。从键盘读取速度太慢了。我已经参加了ICPC比赛,但我过去常常使用C ++。也许您应该尝试BufferedReader而不是Scanner