leetcode#56 Merge Intervals
Given a collection of intervals, merge all overlapping intervals.
For example,
Given[1,3],[2,6],[8,10],[15,18],
return[1,6],[8,10],[15,18].
解释
给定一个时间间隔的集合,要求将所有重叠的时间间隔合并。
我的解法
由于不确定给定的时间间隔集合是不是有序的,所以考虑新创建一个链表保存合并之后的时间间隔,将时间间隔插入新链表的过程中对链表进行比较和排序,以及合并操作。其中有六种边界情况需要考虑:
- 新插入的间隔的
begin大于当前间隔的end; - 新插入的间隔的
end小于当前间隔的begin; - 新插入的间隔的
end在当前间隔内,begin小于当前间隔的begin; - 新插入的间隔的
begin在当前间隔内,end大于当前间隔的end; - 新插入的间隔在当前间隔内;
- 新插入的间隔的两个边界都大于等于当前间隔的边界。
经过上述的重新插入操作之后,得到的结果链表中的间隔都是按照begin 从小到大排序的,本来到这里就应该结束了,但是由于本解法的不完善,会出现部分应该合并的间隔没有被合并,所以需要再次进行一轮比较与合并——只比较end 即可。
虽然不完善且麻烦,但是本解法还是很容易理解的,性能也有——Runtime Beats 92% 。
|
|
大神解法
解法一:
一个时间间隔中存在两个变量start和end ,将它们取出分别存放在两个数组中,对应的索引是相同的,然后对两个数组进行排序——这样就是有序的了。
判断start 与end 之间的关系——由于将这两个参数从间隔中提取出来放在数组中,遍历与比较过程就显得更为容易了,比较过程在遇到starts[i + 1] > ends[i] ,即不重叠的情况时,才利用当前的start 和end 创建一个新的间隔放入结果链表中。
|
|
解法二:
自定义了一个排序方法。
剩下的工作就是对有序的时间间隔进行合并——合并的方法挺不错的,只需两步比较。
|
|