需要进一步优化代码

时间:2017-06-05 09:11:32

标签: java

以下是我需要优化的代码:

    Scanner sc = new Scanner(System.in);
    int sum=0;           //stores the result

创建4个列表,A B C分别保存输入值,D表示结果的最终列表,S表示存储总和。

    ArrayList<Integer> listA = new ArrayList<Integer>();
    ArrayList<Integer> listB = new ArrayList<Integer>();
    ArrayList<Integer> listC = new ArrayList<Integer>();
    ArrayList<Integer> listD = new ArrayList<Integer>();
    ArrayList<Integer> listS = new ArrayList<Integer>();

获取测试用例总数

    int T = sc.nextInt();

每个测试用例的第一行包含3个整数:p,q和r。这些分别表示A,B和C的长度。 第二行包含p个整数,它们是A的元素。第三行包含q个整数,它们是B的元素。第四行包含r个整数,它们是C的元素。

    for(int i=0; i<T; i++){
        int p = sc.nextInt();
        int q = sc.nextInt();
        int r = sc.nextInt();
        for(int j=0; j<p; j++){
            int x = sc.nextInt();
            listA.add(x);
        }
        for(int j=0; j<q; j++){
            int x = sc.nextInt();
            listB.add(x);
        }
        for(int j=0; j<r; j++){
            int x = sc.nextInt();
            listC.add(x);
        }
        for (int k = 0; k < listA.size(); k++){
            int a = listA.get(k);
            for(int j=0; j<listB.size(); j++){
                int b = listB.get(j);
                for(int l=0; l<listC.size(); l++){
                    int c=listC.get(l);
                    //System.out.println("a: "+a+" b: "+b+" c: "+c);
                    int d = (a+b)*(b+c);
                    listD.add(d);
                }
            }

        }
        for(int y=0; y<listD.size(); y++){
            sum += listD.get(y);
        }
        sum = sum%1000000007;
        System.out.println(listD);
        listS.add(sum);

    }
    String formattedString = listS.toString()
            .replace(",", "\n")  //remove the commas
            .replace("[", "")  //remove the right bracket
            .replace("]", "")  //remove the left bracket
            .replace(" ", "")
            .trim(); 
    System.out.println(formattedString);
    sc.close();

有没有办法减少所有嵌套循环?

1 个答案:

答案 0 :(得分:2)

所以基本上你需要在上面的代码中计算(a+b)*(b+c)的值,它基本上是sum=rXY+qXZ+pr*(sum of squares of each element in listB)+p*YZ 的所有可能排列的总和。我将其表述为一个简单的sigma方程,并将其简化如下:

https://github.com/springfox/springfox/issues/1285

从上面的最后一个等式中,如果你将每个列表的总和分别考虑为X,Y和Z,则上面的等式归结为:

O(q^2)

在最差的情况下,与代码中的O(pqr)相比,这是try-finally的顺序。