此代码打印数组中存在的元素组合" pts" (一次4个元素),使得特定的数字组合永远不会出现一次。例如。如果已经打印了1 2 3 4,则不应打印任何排列。
for (int i = 0; i < pts.length; i++) {
for (int j = i+1; j < pts.length; j++) {
for (int k = j+1; k < pts.length; k++) {
for (int l = k+1; l < pts.length; l++) {
System.out.println(""+pts[i]+" "+pts[j]+" "+pts[k]+" "+pts[l]);
}
}
}
}
如果有人可以提出其他方法,或者可以告诉我如何降低此代码的复杂性。我会感恩的
答案 0 :(得分:2)
没有太多可以改善这一点。输出为O(n ^ 4)。复杂性在问题陈述中,而不是在此循环的实现中。您应该查看为什么要用i&lt;来枚举所有集合(i,j,k,l)的原因。 j&lt; k&lt;升。
你可以避免在每个循环中引用pts.length。根据您在循环中的操作,编译器不明显pts长度不会改变。以下代码只有1个对pts.length的引用,并且仍然返回i&lt; j&lt; k&lt; l&lt; pts.length。
for (int l = 0; l < pts.length; l++) {
for (int k = 0; k < l; k++) {
for (int j = 0; j < k; j++) {
for (int i = 0; i < j; i++) {
System.out.println(""+i+" "+j+" "+k+" "+l);
}
}
}
}
请注意,它会更改生成的集的顺序,我不知道它是否重要。无论如何,这是一个真正的小改进。