我有一个排序的数组,我想高效地找到从头到尾最长的相邻子序列,比如array[begin]>=array[end] div 2。
显而易见的是(O^(n^2) ),但是有没有更好的呢?
发布于 2013-05-08 17:16:00
它可以在线性时间内完成。首先,让我们从二次型开始:
如果未到达数组的末尾,则从第一个位置开始,在索引i+1
i.
j,元素a[j]/2 <= a[i],ji.<
关键是要认识到,如果您在第3步中对一对(i, j)失败,那么这意味着:
for every i < k < j, a[k] <= a[i]/2
a[j] > a[i]/2因此,在第5步,转到任何小于j的k将导致较小的分数,因为a[j] > a[i]/2 > a[k]/2。因此,下一个要开始的索引是j。
到目前为止,我们在计算任何分数时,最多只能访问一次索引。这减少了从O(n^2)到O(n)的这一步。那么,取得分最高的指标显然是O(n)。
https://stackoverflow.com/questions/16436174
复制相似问题