计算相似数大于K

时间:2017-12-17 15:44:07

标签: arrays algorithm dynamic-programming

两个阵列X和Y的相似数,每个具有大小N,被定义为索引对(i,j)的数量,使得X [i] = Y [j],对于1 <= i,j

现在给出两个大小为N和M的数组。我们需要从这两个数组中找到大小相等的子数组的数量,这样每个子数组对的数字大于或等于给定数字K.

例如,假设我们有N = 3,M = 3,K = 1,数组是[1,3,4]和[1,5,3]那么这里答案是6

说明:

({1},{1})
({3},{3})
({1,3},{1,5})
({1,3},{5,3})
({3,4},{5,3})
({1,3,4},{1,5,3})

所以ans = 6

如何为给定大小为N,M和给定整数K的数组求解。 元素数量不能超过2000.K也小于N * M

方法: 形成来自大小为N的数组1的所有子阵列,那些将是N *(N + 1)/ 2并且对于大小为M的阵列2相同。然后尝试在每个子阵列对之间找到相似性数。但这是非常不公平的做法。 什么可以更好的方法来解决这个问题?我认为动态编程可以用来解决这个问题。有什么建议吗?

对于{1,1,2}和{1,1,3}以及K = 1

{[1(1)],[1(1)]}
{[1(1)],[1(2)]}
{[1(2)],[1(1)]}
{[1(2)],[1(2)]}
{[1(1),1(2)],[1(1)]}
{[1(1),1(2)],[1(2)]}
{[1(1)],[1(1),1(2)]}
{[1(2)],[1(1),1(2)]}
{[1(1),1(2)],[1(1),1(2)]}
{[1(2),2],[1(2),3]}
{[1(1),1(2),2],[1(1),1(2),3]}

1 个答案:

答案 0 :(得分:0)

由于比赛结束了,只是为了完整起见,这是我对那里的编辑答案的理解(我从中学到了很多)。假设我们有一个O(1)时间方法来计算两个连续子阵列的相似性,每个阵列中有一个长度为l。然后,对于每对索引(i, j),我们可以二分搜索满足相似性l的最小k(扩展,比如左边)。 (一旦我们得到最小的l,我们知道任何更大的l也具有足够的相似性,我们可以在O(1)时间内添加这些计数。)在这种情况下,总时间将是O(M * N * log(max (M,N))

嗯,事实证明有一种方法可以计算O(1)中两个连续子阵列的相似性:矩阵前缀 - 和。在矩阵中,A;如果第一个数组的A(i,j)元素等于第二个数组的1元素,则每个条目ij,否则为0;矩形A A(i-l, j-l)中的元素总和,A(i,j)(左上角到右下角)就是这样。我们可以使用矩阵前缀和计算O(1)时间的总和,给定O(M*N)预处理。