给定排序数组查找所有唯一对的数量,其总和大于X.

问题描述 投票:-1回答:1

有没有比O(n2)更好的复杂性可以实现的解决方案?线性复杂度最好,但O(nlogn)也很好。

我已经尝试对每个元素使用二元搜索,这些元素将是O(nlogn),但我总是缺少一些东西。

例如,给定排序的数组:2 8 8 9 10 20 21 数字X = 18 [2,20][2,21][8,20][8,21][8,20][8,21][9,10][9,20][9,21][10,20][10,21][20,21] 该函数应返回12。

arrays sorting big-o combinations complexity-theory
1个回答
0
投票

对于您的问题,对于任何给定的数字集,可能有一些(包括在任何其他数字中)保证是一种解决方案,因为它们本身大于求和的目标数量。

确定那些。这些的任何组合都是一种解决方案。使用您的示例数据,21和20满足此要求,因此21的所有组合(即6)和20的所有剩余组合(即5)满足您的要求(到目前为止11个结果)。

现在将排序后的数组视为子集,排除上述集合(如果非空)。

从您的新子集中,找到可以包含在该子集中的另一个数字的所有数字,以满足您的要求。从最高(从“复杂性”开始,可能无关紧要,但为了便于编码,尽早知道您没有经常帮助)在您的子集中编号,识别任何,记住任何需要至少两个这样的数字将更多结果添加到已确定的结果中。

在连续的相邻对中获取数据。一旦达到不符合要求的金额,您就知道您已找到表格的最低限额。

按此顺序:

1 2 12 13 14 15 16 17 18 19

19已经符合标准。子集有九个数字。以18和17为准。符合标准。以17和16为准。见面。符合...... 13和12.符合。 12和2.不符合。所以12是范围中的最低值,范围中的项目数是7。

此过程与原始数据产生10和9。一个组合,给你的12个组合寻求。

确定组合的数量应该被抽象出来,因为它很容易计算,并且根据实际情况,可能更快地预先计算。

一个好的经验法则是,如果你自己可以通过查看数据得到答案,那么计算机就很容易了。以同样的方式做到这一点是一个很好的起点,尽管并非总是如此。


找到最高元素的子集,当与数组的任何其他成员配对时,这些子集将导致总和大于期望值。

采用排除那些的子集,使用最高元素并向后工作以找到最低元素,使您获得成功。把它作为你的第三个子集。

您的组合是第一个子集成员的整个组的组合,加上第三个子集的组合。

你是学生,你必须弄清楚这是多么复杂。

© www.soinside.com 2019 - 2024. All rights reserved.