【leetcode】253 Meeting Rooms
输入[[0,31],[5,10],[15,20]]表示每个会议的开始和结束时间,求最少需要多少会议室能够安排所有的会议。
【思路】按照按照开始时间排序,用最小堆保存当前所有会议室的结束时间。
【别人的思路】把开始,结束时间当作两个时间点,结束时间乘以-1,然后按照时间点的绝对值排序,这样就得到了一个时间轴上2n个时间点。正的表示开始时间,负的表示结束时间。设变量count,遍历2n个时间点,遇正+1 遇负-1,count的最大值就是最少需要多少会议室。自己使用php实现代码如下:
<?php
$arr = [[0,31],[5,10],[15,20],[12,16]];
echo meetingRoom($arr); //3
function meetingRoom($arr){
$tmp = [];
$size = count($arr);
for($i=0;$i<$size;$i++){
array_push($tmp,$arr[$i][0]);//存入开始时间
array_push($tmp,-$arr[$i][1]); //存入结束时间
}
//根据绝对值正向排序
usort($tmp, cmp);
//print_r($tmp);
$count = 0;
$cur = 0;
foreach ($tmp as $key => $value) {
if($value >= 0) {
$count++;
$cur = max($count,$cur);
}else{
$count--;
}
}
return $cur;
}
//自定义排序规则
function cmp($a,$b){
if(abs($a) == abs($b)) return 0;
return abs($a) < abs($b) ? -1 : 1;
}
浙公网安备 33010602011771号