繁体   English   中英

使元素之和小于或等于 k 的方式总数

[英]Total number of ways such that the sum of elements is less than or equal to k

任务:找出从每个数组中选择单个元素的可能方法的数量,使得它们的总和小于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;   
}

面试的时候问过这个问题,我看到我用的时候,程序因为测试用例超出时间限制而失败。

执行此任务的最佳方法是什么?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM