解决方案


方法一:排序

思路与算法

对于每一个形如 A[i] = v 的元素,我们将其索引 i 按照对应值 v 排序之后的顺序写下。例如, A[0] = 7, A[1] = 2, A[2] = 5, A[3] = 4,我们应该这样顺序写下索引值 i=1, i=3, i=2, i=0

然后,当我们写下一个索引 i 的时候,我们可以得到候选的宽度答案 i - min(indexes_previously_written) (如果这个值是正数的话)。 我们可以用一个变量 m 记录已经写下的最小索引。

复杂度分析

  • 时间复杂度: ,其中 A 的长度。

  • 空间复杂度: ,基于排序的实现方法。


方法二:二分检索候选位置

思路

按照降序考虑 i , 我们希望找到一个最大的 j 满足 A[j] >= A[i](如果存在的话)。

因此,候选的 j 应该是降序的:如果存在 j1 < j2 并且 A[j1] <= A[j2] ,那么我们一定会选择 j2

算法

我们使用列表记录这些候选的 j。举一个例子,当 A = [0,8,2,7,5],对于 i = 0 的候选列表应该是 candidates = [(v=5, j=4), (v=7, j=3), (v=8, j=1)]。我们要时刻维护候选列表 candidates 按照索引值降序,对应值升序。

现在,我们可以使用二分检索的办法找到最大的索引 j 满足 A[j] >= A[i]:也就是列表中第一个满足 v >= A[i] 的那一项。

复杂度分析

  • 时间复杂度: ,其中 是数组 A 的长度。

  • 空间复杂度: