我在一次采访中被问到这个问题:
给定三个大小不等的数组和一个特定的数字,我必须从这三个数组中的每一个中选择一个数字,然后通过从array1和array2中除数并将其与从array2和array3中除数相乘,找出是否可以获得特定的数字?
For example: If I have three arrays:
Array1: 4
Array2: 3 6
Array3: 2 3 8
我必须找出这个数字(1/4)是否可以得到?是的,因为如果我从第一个数组中选择4,从第二个数组中选择6,然后从第二个数组中选择3,从第三个数组中选择8,
(4/6)*(3/8) which makes it as 1/4.
如何处理这个问题?我想不出任何可靠的证据。谢谢!
最佳答案
让M
成为您想要的号码。
可以从(array2,array3)中遍历所有对(i,j)
(其中有o(n2*n3))并将值array2[i]/array3[j]
存储在一个集合中。
然后,遍历array1和array2中的所有对k,l
(其中有O(n1*n2)
对),并检查集合中是否存在x
这样的值。
这可以通过简单地检查表中是否存在值array1[k]/array2[l] * x = M
来完成。
假设集合的平衡树实现,这将花费x = M*array2[l] / array1[k]
时间。
对于大小不等的数组,可以通过选择存储使乘积总和最小化的数组来稍微改进:O(log(n2*n3) * (n1*n2 + n2*n3))
(其中x1、x2、x3、x4)是数组的大小,array2“得到”此等式中的两个变量),因此基本上可以有以下“存储”组合:
array2/array3(如上例所示)
array1/array2(并检查x=m*array3/array2)
array2/array2(并检查x=m*array3/array1)
array1/array3(并检查x=m*array2/array2)
array1*array2(并检查x=m*array3*array2
1/(array2*array3)(检查x=m/(array2*array1)
关于arrays - 如何组合三个数组的元素以获得所需的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32676200/