从PHP中的范围列表生成唯一的非重叠范围?

时间:2016-08-15 13:47:47

标签: php sorting range unique

算法问题,如果有人能指出我正确的方向,我今天似乎无法绕过头脑。感觉就像我已经可以解决的东西,我可以查找,但我很难找到它。

我有一些范围,我希望从这些范围中获得新的独特非重叠范围。例如:

我的范围

[
  [0] => [
           'Min' => 5,
           'Max' => 10
         ],
  [1] => [
           'Min' => 5,
           'Max' => 12
         ],
  [2] => [
           'Min' => 13,
           'Max' => 15
         ],
  [3] => [
           'Min' => 13,
           'Max' => 18
         ],
  [4] => [
           'Min' => 20,
           'Max' => 24
         ],
]

我想要的是:

注意键2和4已更改不同修复重叠问题。

[
  [0] => [
           'Min' => 5,
           'Max' => 10
         ],
  [1] => [
           'Min' => 11,
           'Max' => 12
         ],
  [2] => [
           'Min' => 13,
           'Max' => 15
         ],
  [3] => [
           'Min' => 16,
           'Max' => 18
         ],
  [4] => [
           'Min' => 20,
           'Max' => 24
         ],
]

注意19是不存在的,因为它不是任何原始范围内的数字。

我已经尝试过搜索,但似乎无法想出这种算法会被命名为什么,所以我得到了很多不相干的结果。

还要注意末尾的非范围是如何重叠并包含唯一的数字(以最小值或最大值为单位)。

谢谢,

1 个答案:

答案 0 :(得分:1)

这就是我要做的事情:

  1. 使用usort对数组条目进行排序。首先是Min升序,然后是Max降序。
  2. 使用0初始化$ upperLimit。
  3. 然后,循环遍历数组和
    1. 将最小值设为最大值($ upperLimit + 1,[' Min'])
    2. 如果Min为> = Max,则抛弃此条目
    3. 将$ upperLimit设为最大值($ upperLimit,[' Max'])