合并多段数字区间的解决方案
2014-03-21 14:41
344 查看
场景:
给定N个数字区间,允许选择任意个。
目标:返回合并后的区间。
举个栗子:
给定5个区间如下:
假设选择的区间为:1、2、4、6、7
则期望返回合并后的区间:
探索出了一个解决方案,欢迎拍砖:
注意此方法需要满足以下约定:
1、相邻区间端点落在同一点上时,包含端点值本身。
2、区间必须有下限(嗯),可以无上限。
给定N个数字区间,允许选择任意个。
目标:返回合并后的区间。
举个栗子:
给定5个区间如下:
ID 区间范围 1 (0,100) 2 [100,200) 3 [200,300) 4 [300,400) 5 (1000,2000] 6 (2000,3000] 7 (3000,+∞)
假设选择的区间为:1、2、4、6、7
则期望返回合并后的区间:
(0,200) [300,400) (2000,+∞)
探索出了一个解决方案,欢迎拍砖:
/** * 合并多段数字区间 * @param array $inputArr 给定的区间ID。 例: * array(1,2) * @param array $intervalArr 区间定义,包括区间ID和数值范围,整个区间必须有下限,可以无上限。 例: * array( * 1 => array( * '>' => 0, * '<=' => 3000, * ), * 2 => array( * '>' => 3000, * '<=' => 6000, * ), * 3 => array( * '>' => 6000, * ) * ) * @return array $resultArr 返回合并后的区间数组。 例: * array( * array( * '>' => 0, * '<=' => 6000 * ) * ) */ public function mergeDigitalInterVal($inputArr, $intervalArr) { $lastArr = $curArr = $resultArr = array(); // 对给定的区间ID数组按照ID从小到大排序 sort($inputArr); // 遍历给定的区间ID foreach ($inputArr as $key => $input) { $input = intval($input); if(!isset($intervalArr[$input])) { continue; } $lastUpperArr = $curLowerArr = $lastLowerArr = $curUpperArr = array(); $curArr = $intervalArr[$input]; // 获取当前区间 if($lastArr) { // 如果存在上个区间 $lastUpperArr = array_slice($lastArr, 1, 1); // 获取上个区间的上限 $curLowerArr = array_slice($curArr, 0, 1); // 获取当前区间的下限 if(array_shift($lastUpperArr) == array_shift($curLowerArr)) { // 上个区间和当前区间可合并 $lastLowerArr = array_slice($lastArr, 0, 1); // 获取上个区间的下限 if(count($curArr) > 1) { // 当前区间有上限 $curUpperArr = array_slice($curArr, 1, 1); // 获取当前区间的上限 $lastArr = $lastLowerArr + $curUpperArr; // 上个区间为合并后新的区间 if(($key+1) == count($inputArr)) { // 已经遍历到最后一个 $resultArr[] = $lastArr; break; } $curArr = array(); continue; } else { // 当前区间没有上限,说明已经遍历到最后一个 $resultArr[] = $lastLowerArr; break; } } else { // 上个区间和当前区间不可合并 $resultArr[] = $lastArr; // 保存上个区间 if(($key+1) == count($inputArr)) { // 已经遍历到最后一个 $resultArr[] = $curArr; // 保存当前区间并退出循环 break; } } } else if(($key+1) == count($inputArr)) { // 不存在上个区间,且已经遍历到最后一个,直接保存当前区间并退出循环 $resultArr[] = $curArr; break; } $lastArr = $curArr; $curArr = array(); } return $resultArr; }
注意此方法需要满足以下约定:
1、相邻区间端点落在同一点上时,包含端点值本身。
2、区间必须有下限(嗯),可以无上限。
相关文章推荐
- 通过SQL 合并不同时间区间或者数字区间问题的解析
- 156.合并区间
- HDU3308 线段树(区间合并)
- POJ 3667 Hotel 线段树 区间合并 入门题
- HDU 3397 Sequence operation(线段树区间合并+区间修改)
- 【tyvj】【区间dp】石子合并
- php导出excel长数字显示成科学计数法格式的解决方案
- Windows Azure真实案例:NeoGeo New Media --SQL Azure提高数字媒体资产解决方案的拓展性
- 区间合并
- 让数字校园走向云端【我身边的戴尔企业级解决方案】
- 【数学】【排序】对若干个区间进行合并
- 合并连续数字的算法
- HDU1540 Tunnel Warfare (线段树区间合并)
- hdu3308 线段树 区间合并
- 区间dp讲解之石子合并问题 区间dp的分析方法
- hdu 5367(线段树+区间合并)
- hdoj 3397 Sequence operation 【线段树区间覆盖 + 异或 + 合并】【维护延迟标记的顺序】
- 合并区间
- POJ - 3667 Hotel (线段树区间合并裸题)
- HDU3308–LCIS(单点修改&&区间合并)