题目
分析
上来一看,三个for循环,从1到n,寻找满足lwh=n的个数,但是这样根本跑不出来答案,n太大了,1e15的级别,O(n)的时间复杂度都不行,更何况是O(n^3)。
尝试降低时间复杂度很难,可以尝试降低数据规模。
插入理论:影响代码运行时间的两个因素算法时间复杂度和数据规模。
我们可以观察一下,满足lwh=n的l,w和h有什么特点。他们肯定是n的因子,那么我们只需要遍历n的因子就可以了。怎么求n的因子呢?一个for循环遍历即可,时间复杂度是O(sqrt(n)),满足要求。
解题
第一步:
求n的因子的代码如下,
long n = 2021041820210418l;
Set<Long> set = new HashSet<Long>();
for(long i = 1;i <= n / i;i++) {
if(n%i==0) {
set.add(i);
set.add((n/i));
}
}
因为找到一个小于sqrt(n)的因子i,必然也能根据i找到大于sqrt(n)的另一个因子,即n/i。
第二步:
遍历n的因子
long ans = 0;
for(Long a:set)
for(Long b:set)
for(Long c:set)
if(a*b*c==n) ans++;
第三步:
输出答案
System.out.println(ans);
完整代码:
import java.util.HashSet;
import java.util.Set;
public class 货物摆放 {
public static void main(String[] args) {
long n = 2021041820210418l;//2430
Set<Long> set = new HashSet<Long>();
for(long i = 1;i <= n / i;i++) {
if(n%i==0) {
set.add(i);
set.add((n/i));
}
}
long ans = 0;
for(Long a:set)
for(Long b:set)
for(Long c:set)
if(a*b*c==n) ans++;
System.out.println(ans);
}
}