两个阵列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]}
答案 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
元素,则每个条目i
为j
,否则为0
;矩形A
A(i-l, j-l)
中的元素总和,A(i,j)
(左上角到右下角)就是这样。我们可以使用矩阵前缀和计算O(1)
时间的总和,给定O(M*N)
预处理。