蓝桥杯-货物摆放
真的是一道看起来简单但是却很容易超时的问题,必须想办法降低时间复杂度。
优化思路:
遍历的时候减少遍历次数,那如何减少遍历次数呢,因为 L、W、H 的乘积是 n,那么 L、W、H 就是 n 的因数,n 余 L、W、H 都为0,所以 L、W、H 必定在 n 的因数中,当求出 n 所有的因数,再根据因数求方案就会快速很多。
求解 n 的因数也可以进行优化,因为 n%x=0,n/x=y,那么 n
%y=0,所以找到一个因数就相当于找到了两个因数,缩短了遍历遍数,但是这里要注意的是,对于一些 x*x = n 的特殊情况,只能找到一个因数。
import java.util.ArrayList;
public class Main {
public static void main(String args[]) {
long num = 2021041820210418l;
ArrayList<Long> arr = new ArrayList<Long>();
for(long i=1; i<=Math.sqrt(num); i++) {
if(num%i==0) {
arr.add(i);
long um = num/i;
if(um!=i) {
arr.add(um);
}
}
}
int count = 0;
for(long i:arr) {
for(long j:arr) {
for(long k:arr) {
if(i*j*k==num) {
count++;
}
}
}
}
System.out.println(count);
}
}