arrays - 给定三个等长数组,我如何找到可能的组合数量,其中我以递增的方式从每个数组中选择一个整数

标签 arrays algorithm loops iteration

假设我有三个长度为 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。得到这个数字的最有效方法是什么?

最佳答案

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

对于第二个数组的每个项目 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)

关于arrays - 给定三个等长数组,我如何找到可能的组合数量,其中我以递增的方式从每个数组中选择一个整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51525432/

相关文章:

javascript - 如何从javascript中带有空参数的函数返回零?

c - 从数组中添加/删除元素

python - 特定 bin 内 numpy 数组的元素数量

algorithm - 如何计算二分搜索复杂度

c - C 中的排序算法错误(基数排序的变体)

javascript - 如何使用双for循环从json中检索过滤后的数据

javascript - 添加相同的属性:value pair to multiple objects in array

algorithm - 如何数值测试振荡曲线的稳定性?

c++ - 我正在尝试创建一个类 vector ,然后用 for 循环命名每个类

python - 如何在 python 中跳过单个循环迭代?