当前位置: 首页 > 知识库问答 >
问题:

找到具有给定约束的最大和的对

宰父智敏
2023-03-14

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

例子:

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])

请注意,由于约束,这与在2个数组中查找第k个最大和的对不同。

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

共有2个答案

王辉
2023-03-14

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

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) 表示 put O(nlogn) 表示 floorEntry,总体 O(nlogn)。空间复杂度 O(n)

平俊茂
2023-03-14

首先,您应该对两个数组进行排序。然后您可以使用此迭代:

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。

 类似资料:
  • 给定一个正整数数组,返回最大和。 只有一个限制:如果你选择两个连续的元素,你不允许在你的总数中添加任何后续的元素,你的总和是到那个点为止的累积量。你的目标是最大化你的总和。 输入:[1,4,2,10] 产出:14 输入:[1,4,5,3] 产出:9 我在第一个测试案例中一直失败。我尝试了DP解决方案,但产生了相同的结果?任何帮助都将不胜感激。

  • 如果某些数组索引不能配对,我将如何找到唯一正整数数组的最大和? 例如,我们有一个数组:[8,2,1,3,9,4] 索引(0,4)和(4,5)处的元素彼此不喜欢。 在这种情况下,最大和为:8 2 1 3 4=18 假设这是100个条目的规模和多达一半的约束,您将如何处理这个问题? 是否有一个像图形这样的数据结构是有用的还是有一些DP?我主要关心的是高效的运行时。

  • 本文向大家介绍在C ++中的BST中找到具有给定总和的对,包括了在C ++中的BST中找到具有给定总和的对的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序,在二进制搜索树中找到总和等于给定数字的对。 我们将在两个不同的列表中存储树的值和树的值以查找对。让我们看看解决问题的步骤。 为二叉树创建一个结构节点。 编写一个函数以将新节点插入二进制搜索树。 请记住,在二叉搜索树中,所

  • 本文向大家介绍在Python中给定的嵌套列表中找到具有最大值的子列表,包括了在Python中给定的嵌套列表中找到具有最大值的子列表的使用技巧和注意事项,需要的朋友参考一下 列表可以包含其他列表作为其元素。在本文中,我们等于找到给定列表中存在的具有最大值的子列表。 带有max和lambda max和Lambda函数可以一起使用,以给出具有最大值的子列表。 示例 输出结果 运行上面的代码给我们以下结果

  • 我试图解决的问题如下:我想在给定的数组中找到一个最大的数字跨度,该数组由正整数和负整数组成,返回最大值(a[j]-a[I]),这样1 求数组的n阶统计量的索引,使其为“i” 这个算法是O(nlogn),但我不知道它是否正确。

  • 我有一个GoogleSheets触发器功能,它可以在表单提交中根据为我的一个问题选择的值将提交内容放置在表单中。我正在尝试使用“作为附加项进行测试”功能测试我的函数,但是当我提交表单时,我在我的函数中收到一个错误,错误消息是来自触发器 这是错误的一行, 这使我认为存在身份验证问题,但我不确定如何进一步调试 完整代码: