你有k
排序整数的列表。查找每个k
列表中至少包含一个数字的最小范围。
例如
List 1: [4, 10, 13, 14]
List 2: [0, 9, 15, 18]
List 3: [5, 18, 22, 30]
这里的最小范围是[14, 18]
,因为它包含来自list 1
的14
,来自list 2
15
来自list 3
的18
。
我的方法是:
- 只需使用 MinHeap 并插入
K
列表中的第一个元素 - 删除 min 元素并从相应的列表中添加下一个元素
- 同时跟踪最大值和最小值,以便我们可以计算最小范围
但我面临的唯一问题是:假设一个列表没有更多的元素,而不是我应该在那里完成还是应该继续?
非常好的 O(n log n) 算法!
您可以在那里完成,因为您永远不会找到满足给定条件"每个 k 列表中至少包含一个数字的范围"的更好区间。
假设您要保留当前的最小m
(某个列表中的最后一个元素),而是从另一个列表中删除某些内容(不是最小值)。在这种情况下,范围只能增长(因为范围的最小值由 m
确定)。所以这样做是没有意义的,你可以停止你的算法。
不,这不是您的终止条件。请看这个例子:
1: [0]
2: [1]
范围非常明显 [0,1]
,但是如果您在检测到空列表后立即停止,则会返回[0,0]
。
因此,只有在您知道已看到所有k
列表中的值并且其中一个列表的项目已用完后,才能停止。如果您分别跟踪每个列表的最小值和最大值,这应该很容易,因为您可以确保每个列表都有一些最小值和最大值。