设,A1, A2, ... An 是 n 个数组。
假设所有数组都已排序,否则我们可以单独对它们进行排序。
S = [ A1[0], A2[0],...An[0] ]
minSpread = max{S} - min{S}
Iterate i = 1 to L (where L is length of shortest array)
Remove min{S} from S.
Insert Ak[i] in S. (where Ak is the kth array from which a value was removed in previous step.)
minSpread = min(minSpread, max{S} - min{S});
由于我们必须最小化传播(最大-最小),我们唯一的选择是通过删除当前的最小值来“向上”挤压最小值。
在 O(N) + O(N*L*logN) 中计算,其中 N 为否。数组和 L 是最短数组的长度。
这是显示搜索结果时的常见问题。当我们必须显示包含所有给定搜索词的页面摘录的最小可能窗口时。
这里,A1[] A2[]...An[] 包含单词say-W1,W2...Wn 出现的索引。
编辑:
尼莫:你说得对。证明有点牵强。您提供的链接尝试了类似的解决方案。我能补充的是:
考虑以下事实:
1. 我们必须从每个数组中准确地维护一个元素。
2. 数组全部按升序排列。
因此,帮助我们立即丢弃许多组合,与生成所有组合相比,可以在更好的时间内完成它。有关更多详细信息,请访问“Nemo”提供的链接。
并且,通过按照建议维护一个 minheap,可以将复杂性降低到 O(N) + O(N*L*logN)。
其中,N 为否。数组和 L 是最短数组的长度。