最小范围,包括每个 k 列表中的至少一个数字



你有k排序整数的列表。查找每个k列表中至少包含一个数字的最小范围。

例如

List 1: [4, 10, 13, 14] 
List 2: [0, 9, 15, 18] 
List 3: [5, 18, 22, 30] 

这里的最小范围是[14, 18],因为它包含来自list 114,来自list 2 15来自list 318

我的方法是:

  • 只需使用 MinHeap 并插入K列表中的第一个元素
  • 删除 min 元素并从相应的列表中添加下一个元素
  • 同时跟踪最大值和最小值,以便我们可以计算最小范围

但我面临的唯一问题是:假设一个列表没有更多的元素,而不是我应该在那里完成还是应该继续?

非常好的 O(n log n) 算法!

您可以在那里完成,因为您永远不会找到满足给定条件"每个 k 列表中至少包含一个数字的范围"的更好区间。

假设您要保留当前的最小m(某个列表中的最后一个元素),而是从另一个列表中删除某些内容(不是最小值)。在这种情况下,范围只能增长(因为范围的最小值由 m 确定)。所以这样做是没有意义的,你可以停止你的算法。

不,这不是您的终止条件。请看这个例子:

1: [0]
2: [1]

范围非常明显 [0,1] ,但是如果您在检测到空列表后立即停止,则会返回[0,0]

因此,只有在您知道已看到所有k列表中的值并且其中一个列表的项目已用完后,才能停止。如果您分别跟踪每个列表的最小值和最大值,这应该很容易,因为您可以确保每个列表都有一些最小值和最大值。

最新更新