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

时间:2014-01-15 10:19:08

标签: java algorithm data-structures

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

例如,

List 1: [4, 10, 13, 14] 

List 2: [0, 9, 15, 18] 

List 3: [5, 18, 22, 30] 

此处的最小范围为[14, 18],因为它包含来自14的{​​{1}},来自list 1的{​​{1}}和来自{{15的{​​{1}} 1}}。

我的方法是:

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

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

1: [0]
2: [1]

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

因此,只有当您知道所有k列表中的值,其中一个列表的项目已用完时,您才能停止。如果您分别跟踪每个列表的最小值和最大值,这应该非常简单,因为您可以确保每个列表都有一些最小值和最大值。