创建一个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 个子数组。所以新的值为ANS2+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)。这是我能得到的最好的。
您可以看到我们不需要为此配对。对的第一个值,元素的值不是必需的。我用它来更好地理解。你总是可以跳过那个。