我要解决一个问题,函数“thor”接收3个数组列表和一个int,算法必须上传到一个页面,如果函数是正确的,在第一次测试页面返回预期的结果,但是继续测试时,返回“超过时间限制,代码用了太多cpu”。我需要帮助解决这个问题,谢谢!
import java.util.*;
public class microondas {
public static long thor(ArrayList<Integer> a, ArrayList<Integer> f, ArrayList<Integer> p, int D) {
long acumu,peso,altura,fuerza,distancia;
acumu=0;
for(int i=0;i<a.size();i++) {
for(int s=0;s<p.size();s++) {
peso=p.get(s);
altura=a.get(i);
fuerza=f.get(i);
distancia=(altura*fuerza)/peso;
if(distancia>=D) {
acumu+=1;
}
}
}
return acumu;
}
}
如何节省内存?我认为二维颊部是问题所在。
1条答案
按热度按时间83qze16e1#
在这段代码和可用的信息只有基本的微观优化是可能的:没有必要计算
altura
/fuerza
因为这些变量依赖于第一个循环。此外,除以常量值可能会移到嵌套循环之外:但是,它不太可能帮助解决tle,因为此代码无论如何都有复杂性
O(N * M)
哪里N
大小是a
/f
以及M
大小是p
.进一步优化可以是:
对产品清单进行预计算和排序,
排序列表
p
迭代列表时p
记住最后一个有效的peso
丢弃包含小值的尾部。一些快捷方式是可能的:
如果最大产品小于最小产品
peso
,所有产品可报废,0退回;如果最大的
peso
小于或等于最小积,结果为product.size() * p.size()
```public static long thorFaster(List a, List f, List p, int D) {
Collections.sort(p);
List products = new ArrayList<>();
}
List a = Arrays.asList(1, 0, 2, 3, 4, 5, 8);
List f = Arrays.asList(2, 3, 4, 4, 6, 1, 0);
List p = Arrays.asList(3, 4, 5, 8, 10);
System.out.println("thor: " + thor(a, f, p, 2));
System.out.println("thorFaster: " + thorFaster(a, f, p, 2));
thor iterations: 35
thor: 10
thorFaster iterations: 13
thorFaster: 10