【发布时间】:2020-01-30 18:24:23
【问题描述】:
我研究分治法有一段时间了,现在正在研究以下问题:
给定一个长度为 N 的排列 P,计算好段的数量。请注意,N 个整数的序列 A 称为长度为 N 的排列,如果:
1≤ Ai ≤ N 对于所有 1 ≤ i ≤ N,并且 Ai != Aj 对于所有 1 ≤ i != j ≤ N。
如果 (Pl, Pl+1 , ..., Pr) 也是连续的。也就是说,如果我们将 Pl, Pl+1, ..., Pr 收集到一个新的列表 B 中并对其进行排序,那么这将成立:
B1 = B2-1, B2 = B3-1, ... , Bi-1 = Bi-1, ..., B|B|-1 = B|B| -1.
例如,在排列[3,2,4,5]中,有8个好的段:
[3]、[2]、[4]、[5]、[3,2]、[4,5]、[3,2,4] 和 [3,2,4,5]
我分析了组合两个小的分割数组时的几种情况,但我想不出一种策略可以在 O(N) 时间内检测到跨越两个单独数组的好段。
如何做到这一点?
【问题讨论】:
标签: algorithm divide-and-conquer