【发布时间】:2021-01-19 07:34:25
【问题描述】:
给定一个区间列表 [start, end] 我必须根据指定的合并距离合并它们。间隔以特定顺序到达,并且当它们到达时,它应该在收到每个间隔时根据指定的合并距离合并它们。其中一些间隔将被删除(在到达流中它们将被标记为已删除)——在这种情况下,我必须将原始间隔视为从未存在过。示例:
合并距离为 7 - 在以下示例中,输入按顺序到达
我尝试了以下算法来合并它们,但我的输出与上面的示例不同。有人可以帮助我吗,我在这里缺少什么!
这是我的代码。
class Program
{
static void Main(string[] args)
{
var intervals = new List<Interval>
{
new Interval
{
start = 1,
end = 20
},
new Interval
{
start = 55,
end = 58
},
new Interval
{
start = 60,
end = 89
},
new Interval
{
start = 15,
end = 31
},
new Interval
{
start = 10,
end = 15
},
new Interval
{
start = 1,
end = 20
}
};
var mergedIntervals = Merge(intervals, 7);
foreach (var item in mergedIntervals)
{
Console.WriteLine($"[{item.start}, {item.end}]");
}
Console.ReadKey();
}
public static List<Interval> Merge(List<Interval> intervals, int mergeDistance)
{
var result = new List<Interval>();
for (int i = 0; i < intervals.Count; i++)
{
var newInterval = new Interval(intervals[i].start, intervals[i].end);
//while (i < intervals.Count - 1 && newInterval.end >= intervals[i + 1].start)
while (i < intervals.Count - 1 && newInterval.end <= mergeDistance) // intervals[i + 1].start)
{
newInterval.end = Math.Max(newInterval.end, intervals[i + 1].end);
i++;
}
result.Add(newInterval);
}
return result;
}
}
public class Interval
{
public int start { get; set; }
public int end { get; set; }
public Interval()
{
}
public Interval(int start, int end)
{
this.start = start;
this.end = end;
}
}
【问题讨论】:
-
对于区间
[[1,4], [10, 15], [5, 9]],合并距离为5,最后的区间([5, 9])是否应该与[1,4]或[5, 9]或两者合并? -
如果您正在考虑合并距离 5,那么这里是一个示例:给定两个区间 [1,5] 和 [10,15] 以及合并距离 5,这两个区间在此范围内重叠合并距离允许它们被合并到 [1,15] 的新区间。类似地,给定两个区间 [1,5] 和 [11,15] 以及合并距离 5,您无法合并这两个区间,因为它们在合并距离上不重叠
-
你没有回答我的问题。如果有三个区间:
[1,4]和[10, 15]先出现,然后[5, 9],合并范围为5?输出是[[1, 9], [10, 15]]、[[1,4], [5, 15]]还是[1, 15]? -
我们可以按照到达时间排序,然后按照距离合并。
-
你的意思是“按每个区间的开始排序”吗?这只是将整个“以特定顺序出现”的细节抛到了窗外。顺序不重要吗?
标签: c# algorithm merge intervals