【问题标题】:Total number of ways such that the sum of elements is less than or equal to k使元素之和小于或等于 k ​​的方式总数
【发布时间】: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,我已经修好了

标签: java algorithm


【解决方案1】:

让列表的长度为N。您的方法是O(N^4),它可能会超时。
一个简单但更快的方法是:

  1. 从数组AB 生成所有对和(小于k)。将它们存储在数组X 中。复杂度:O(N^2)
  2. 从数组CD生成所有对和(小于k),将它们存储在数组Y中。复杂度:O(N^2)
  3. 对数组XY 进行排序。复杂性:O(N^2 logN)
  4. 对于X 中的每个元素,找到Y 中的最大元素,使得它们的sum &lt; k。使用二分查找,复杂度:O(N^2 logN)

空间复杂度:O(N^2),时间复杂度:O(N^2 logN)

【讨论】:

    猜你喜欢
    • 2016-09-09
    • 1970-01-01
    • 2015-03-19
    • 2021-06-04
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    相关资源
    最近更新 更多