合并PHP数组中的重叠范围?

Frx*_*rem 15 php arrays merge range

我有一个以下格式的数组:

array(
  0 => array(1, 5),
  1 => array(4, 8),
  2 => array(19, 24),
  3 => array(6, 9),
  4 => array(11, 17),
);
Run Code Online (Sandbox Code Playgroud)

每个项目是X到Y范围.我想合并数组中的重叠范围,以获得更像这样的东西:

array(
  0 => array(1, 9), // 1-5, 4-8 and 6-9 are overlapping, so they are merged
  1 => array(11, 17),
  2 => array(19, 24),
);
Run Code Online (Sandbox Code Playgroud)

实现这一目标的最佳方法是什么?

Mat*_*hew 20

未经测试,但这里的想法是首先按第一个元素对数据进行排序,然后尽可能长时间地将后续元素与前一个元素合并.

usort($data, function($a, $b)
{
        return $a[0] - $b[0];
});

$n = 0; $len = count($data);
for ($i = 1; $i < $len; ++$i)
{
        if ($data[$i][0] > $data[$n][1] + 1)
                $n = $i;
        else
        {
                if ($data[$n][1] < $data[$i][1])
                        $data[$n][1] = $data[$i][1];
                unset($data[$i]);
        }
}

$data = array_values($data);
Run Code Online (Sandbox Code Playgroud)

  • 这个O(n)怎么样?开头的排序已经是nlogn了. (4认同)
  • @Tom,有整数,你想要`[1,2],[3,4]`是一个单一范围的`[1,4]`.在这种情况下,它会读取`if(3> 2 + 1)`然后开始一个新的范围.对于浮点数,它并没有真正有用.+1可以被删除或设置为非常小的增量(+.00001),具体取决于您认为小到足以为相同的数字. (3认同)