关于“二值区间”问题的解决——提取可用的区间

<?php
$data = [
    ['start' => 0, 'end' => 1],
    ['start' => 2, 'end' => 4],
    ['start' => 4, 'end' => 6],
    ['start' => 3, 'end' => 4],
    ['start' => 6, 'end' => 7],
    ['start' => 8, 'end' => 9],
    ['start' => 10, 'end' => 12],
    ['start' => 9, 'end' => 10]
];

$startTime = time();
// 排序start
$leftKeys = array_column($data, 'start');
for($i = 0; $i < count($leftKeys) - 1; $i ++) {
    $smallNum = $i;
    for ($j = $i + 1; $j < count($leftKeys); $j++) {
        if ($leftKeys[$j] < $leftKeys[$smallNum]) $smallNum = $j;
    }
    if ($smallNum != $i) {
        $tmp = $leftKeys[$i];
        $leftKeys[$i] = $leftKeys[$smallNum];
        $leftKeys[$smallNum] = $tmp;
    }
}
var_dump($leftKeys);

// 按start从小到大排序所有区间
$sortList = [];
$data = array_column($data, null, 'start');
foreach ($leftKeys as $val) {
    array_push($sortList, $data[$val]);
}

// 检索可用区间
$efData = [];
$lastData = $sortList[0];
foreach ($sortList as $key => $nowData) {
    if ($key == 0) continue;
    if ($lastData['end'] < $nowData['start']) {
        array_push($efData, $lastData);
        $lastData = $nowData;
        continue;
    }
    if ($lastData['end'] >= $nowData['start'] && $lastData['end'] < $nowData['end']) {
        $lastData['end'] = $nowData['end'];
        if ($key == count($sortList) - 1) array_push($efData, $lastData);
        continue;
    }
    if ($lastData['end'] >= $nowData['end']) {
        if ($key == count($sortList) - 1) array_push($efData, $lastData);
        continue;
    }
}
$endTime = time();
echo "耗时", ($endTime - $startTime), "\n";
echo "可用结果" . "\n";
var_export($efData);

结果:
脚本结果


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值