创建一个pair数组,其中每对存储子数组元素的值及其索引。
pair[i] = (A[i],i);
按 的升序A[i]
和的降序对这对进行排序i
。
考虑排序后的示例A = [1,3,6,3,6,3,1,3];
对数组将是pair = [(1,6),(1,0),(3,7),(3,5),(3,3),(3,1),(6,4),(6,2)]
pair[0]
有 的元素index 6
。从index 6
我们可以有两个子数组[1]
和[1,3]
。所以ANS = 2
;
现在把每一对连续的一对一个接一个。
取pair[0]
和pair[1]
,
pair[1]
索引为 0。我们可以有 8 个从 开始的子数组index 0
。但是已经计算了两个子数组 [1] 和 [1,3]。所以要删除它们,我们需要比较 和 的子数组的最长公共pair[0]
前缀pair[1]
。因此,从 0 和 6 开始的索引的最长公共前缀长度是 2 即[1,3]
。
所以现在新的不同子数组将是[1,3,6]
.. 到[1,3,6,3,6,3,1,3]
6 个子数组。所以新的值为ANS
2+6 = 8;
所以对于pair[i]
和pair[i+1]
ANS = ANS + Number of sub-arrays beginning from pair[i+1] - Length of longest common prefix
。
排序部分需要 O(n logn)。
迭代每个连续对是 O(n) 并且对于每次迭代,找到最长的公共前缀需要 O(n) 使得整个迭代部分 O(n^2)。这是我能得到的最好的。
您可以看到我们不需要为此配对。对的第一个值,元素的值不是必需的。我用它来更好地理解。你总是可以跳过那个。