【问题标题】:Given three equal length arrays, how can i find the number of possible combinations where i pick an integer from each array in an increasing fashion给定三个相等长度的数组,我如何找到可能的组合数量,其中我以递增的方式从每个数组中选择一个整数
【发布时间】:2019-01-02 15:48:31
【问题描述】:

假设我有三个 n 长度的数组:

first = [19, 29, 60];
second = [20, 12, 30];
third = [26, 60, 90];

如果不遍历三个嵌套循环,找到可能组合总数的最佳方法是什么,我可以从第一个数组中选择一个整数,然后从第二个数组中选择一个更大的整数,然后从第三个数组中选择一个更大的整数。本质上,一种组合是:

first[i] < second[j] < third[k]
for example: 19 < 30 < 90 or 29 < 30 < 60

上例中的组合总数为 7。获得这个数字的最有效方法是什么?

【问题讨论】:

    标签: arrays algorithm loops iteration


    【解决方案1】:

    对所有数组进行排序(数组长度为 N 的复杂度 O(NlogN))

    对于第二个数组的每个项目B[i],获取第一个数组L中较小项目的数量和第三个数组R中较大项目的数量

    L*R 添加到结果中

    (线性复杂度,因为L 只能随着i 的增加而增加,而R 只能减少)

    第二阶段的伪代码:

     ia = 0
     ic = 0
     for ib in range(N):
         while (A[ia] < B[ib]):
             ia++
         while (C[ic] <= B[ib]):
             ic++
         result += ia * (N - ic)
    

    整体复杂度为O(NlogN)

    【讨论】:

    • 也许您应该提供一些有关如何在线性时间中执行第二步的详细信息。
    • 在我看来第二步也是O(NlogN),但是整体复杂度还是一样的。
    • 确实,我也这么认为。可能有一种线性方法可以做到这一点,但它稍微复杂一些。到第一步,复杂性仍然保持不变。
    • @Razvan Socol 我们不需要在第二阶段的每一步都进行二进制搜索来找到 L 和 R - 请注意,第二个数组也已排序。
    • @MBo 谢谢你的建议。排序后,对于第二个数组中的每个值,我反向循环第一个数组,直到找到 L[j]
    猜你喜欢
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2011-10-27
    • 2021-11-19
    • 1970-01-01
    • 2019-08-08
    • 2019-12-07
    • 1970-01-01
    相关资源
    最近更新 更多