【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; }