【问题标题】:Find the pair(s) with the max sum with given constraints找到具有给定约束的最大和的对
【发布时间】:2018-08-03 09:09:19
【问题描述】:

我最近在一次工作面试中被要求在给定约束条件下找到两个数组的最大总和。这个问题的措辞不同,但归结为我上面所说的。没有提到元素是不同的,或者数组是排序的。

例子:

A = [2000, 3000, 4000, 5000]
B = [6000, 5000, 4000, 1000]
Constraint: A[i] + B[j] <= 7000
Expected Result: (A[0], B[1]), (A[1], B[2])

请注意,由于限制,这与Find the pair across 2 arrays with kth largest sum 不是同一个问题。

蛮力解决方案是取 2 个数组的笛卡尔积,计算每对的和,过滤掉大于 7000 的数组,排序,取相等的最高值。时间复杂度为 O(n2)。我们能做得更好吗?

【问题讨论】:

    标签: arrays algorithm


    【解决方案1】:

    一开始,你应该对两个数组进行排序。然后你可以使用这个迭代:

    for every number in A:
        perform binary search to find biggest element in B lower than 7000-A
    

    您在二分搜索中找到的数字是数组 A 中当前数字配对的最佳数字。您可以取这些值中的最大值(对于数组 A 上的所有迭代)。

    二分查找在 O(logN) 时间内运行,因此此迭代在 O(NlogN) 时间内运行,排序也在 O(NlogN) 时间内运行。你可以用一个变量来改变 7000。

    【讨论】:

    • 排序会破坏给定的顺序。你能在我的例子中展示你是如何得出答案的吗?
    • 您可以使用另一个数组或类似数据结构的集合。
    【解决方案2】:

    回答我自己的问题,以下是一个可行的解决方案:

    public List<Map.Entry> max(int[] a, int[] b, int sum) {
        NavigableMap<Integer, Integer> distMap = new TreeMap<>();
        SortedMap<Integer, List<Map.Entry>> indicesMap = new TreeMap<>();
    
        for (int i = 0; i < a.length; i++) {
            distMap.put(a[i], i);
        }
    
        for (int i = 0; i < b.length; i++) {
            int diff = sum - b[i];
            Map.Entry<Integer, Integer> floorEntry = distMap.floorEntry(diff);
            if (Objects.nonNull(floorEntry)) {
                int tmp = b[i] + floorEntry.getKey();
                int j = i;
                indicesMap.merge(
                        tmp,
                        new ArrayList<Map.Entry>() {{
                            add(new AbstractMap.SimpleImmutableEntry<>(floorEntry.getValue(), j));
                        }},
                        (l1, l2) -> {
                            l1.addAll(l2);
                            return l1;
                        }
                );
            }
        }
        return indicesMap.get(indicesMap.lastKey());
    }
    

    时间复杂度:O(n) for put + O(nlogn) for floorEntry,总体O(nlogn)。空间复杂度O(n).

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多