是否有任何解决方案可以实现复杂性优于 为O(n 2 )?线性复杂度最好,但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。
答案 0 :(得分: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种组合。
确定组合的数量应该被抽象出来,因为它很容易计算,并且根据实际情况,可能更快地预先计算。
一个好的经验法则是,如果你自己可以通过查看数据得到答案,那么计算机就很容易了。以同样的方式做到这一点是一个很好的起点,尽管并非总是如此。
找到最高元素的子集,当与任何数组的其他成员配对时,这些元素会导致和大于所需的值。
采用排除那些的子集,使用最高元素并向后工作以找到最能帮助您获得成功的元素。把它作为你的第三个子集。
您的组合是第一个子集成员的整个组的组合,加上第三个子组的组合。
你是学生,你必须弄清楚这是多么复杂。