创建一个二元组数组,每个二元组存储子数组元素的值和其索引。
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]
元素的索引为 6
。从索引 6
开始,我们可以得到两个子数组 [1]
和 [1,3]
。因此,ANS = 2
;
现在逐一取每个连续的对。
取 pair[0]
和 pair[1]
,
pair[1]
的索引为 0。我们可以从索引 0 开始得到 8 个子数组。但是已经计算了两个子数组 [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 + 以 pair[i+1] 开头的子数组数目 - 最长公共前缀的长度
。
排序部分需要 O(n logn) 时间。
迭代每个连续的一对需要 O(n),每次迭代查找最长公共前缀需要 O(n),整个迭代部分的时间复杂度为 O(n^2)。这是我能获得的最好结果。
您可以看到,我们不需要对此使用 pair。第一个值对于元素的值并不是必需的。我使用它只是为了更好理解。您可以随时跳过它。
[]
,它是每个数组的子数组。否则,你必须将sub-array
定义为非空连续序列... - Bakuriu