【发布时间】:2021-02-07 01:46:32
【问题描述】:
任务:找出从每个数组中选择单个元素的可能方法的数量,使得它们的总和小于k。
这是我的程序的样子:
public static long process(List<Integer> a, List<Integer> b, List<Integer> c, List<Integer> d, int k) {
Collections.sort(a);
Collections.sort(b);
Collections.sort(c);
Collections.sort(d);
long total = 0;
// four layer for loop to check all combinations of four arrays
for (int i = 0; i < a.size(); i++) {
long v = a.get(i);
for (int j = 0; j < b.size() && v < k; j++) {
long v1 = b.get(j);
for (int m = 0; m < c.size() && v + v1 < k; m++) {
long v2 = c.get(m);
for (int l = 0; l < d.size() && v + v1 + v2 < k; l++) {
long v3 = d.get(l);
if (v + v1 + v2 + v3 <= k) {
total = total + 1;
} else {
break;
}
}
}
}
}
return total;
}
这个是面试的时候问的,我看到我用的时候,程序因为测试用例超过时间限制而失败。
执行此任务的最佳方法是什么?
【问题讨论】:
-
好吧,如果我看到四个级别的
for循环,我不会对超过时间限制感到惊讶。多于两级的循环几乎在所有情况下都是有问题的。 -
您至少可以在进入下一个循环之前开始汇总值,如果已经很高就停止(这可能会有所帮助)。但是是的,最好的办法是摆脱那么多 for 循环。
-
@JanezKuhar,我已经修好了