以下是我需要优化的代码:
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();
有没有办法减少所有嵌套循环?
答案 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
的顺序。