所以我有一个由一些具有StartTime和Duration成员变量的对象组成的数组。 startTime变量是格式为“14:20”的字符串,Duration变量是一个数字,表示分钟数。
你们可以推荐最佳逻辑来通过阵列和组合重叠元素。例如,如果数组有两个对象,第一个对象的startTime为“00:00”&持续时间为60,第二个对象的开始时间为“08:00”&持续时间为120,它们将作为单独的元素保留但是如果第二个对象的开始时间为“00:30”且持续时间为120,则两者将合并为一个对象,其startTime为“00:00”,并且持续时间为150.
我已经坚持了一段时间的一般逻辑,因为当组合两个块时,我无法弄清楚如何处理这种情况,但新的组合块会创建一个必须处理的新重叠。我只想到这个错误吗?!通常我对这种事情很好,但我在这里真的很挣扎。
答案 0 :(得分:0)
扩展@gavgrif ...
我推荐这些内容。
php示例:
$segment = array('start' => -1, 'end' => -1); // force new segment on init
$segments = array();
foreach ($items as $item) {
if ($item['start'] > $segment['end']) {
// add current segment (ignore initial fake segment) to segments
if ($segment['start'] > -1) {
// close out current segment
$segments[] = $segment;
}
// start new segment
$segment = $item;
} else {
// increment segment end if its later than current segment end
$segment['end'] = max($segment['end'], $item['end'];
}
}
// close out final segment
$segments[] = $segment;
答案 1 :(得分:0)
我会通过创建两个树来实现这一点,一个由StartTime索引,另一个由EndTime索引(StartTime + Duration)。在两个树中搜索重叠的元素。一旦搜索完成,任何找到的元素都将从两个树中删除,并且单个新元素(StartTime = minStartTime(searchResult),EndTime = maxEndTime(searchResult))将被插入到两个树中。
使用一点额外的存储空间,但我相信这会使您的重叠问题变得微不足道。
(作为练习留下的树实现:)