该博文参考了如下blog:
https://emre.me/coding-patterns/merge-intervals/
Interval中文意思是间隔,可以理解为区间。生活中很多可以描述为interval,例如会议时间的区间,公交车运行站点区间等等。一般理解为时间区间较好,多数题目都可以按照时间区间理解,有助于我们了解题目的具体场景。
给定两个间隔A和B,会有6种不同的方式这两个间隔之间的关系:
但是如果a.start <= b.start,也就是给定的区间是起始时间有序排列,那么只有1,2,3种情况,其中2和3是overlap(交叉的)。如果我们要merge 交叉的a和b两个区间,则对应的结果c如图:
给出公式就是:
c.start = a.start
// c的开始取a的start,也就是min(a.start, b.start),因为a,b有序,所以即为a.start
c.end = max(a.end, b.end)
// c的结束时间取a和b的结束时间的最晚值
如果我们要判断两个interval是否交叉,如上图所示,则只需要判断b的开始时间是否大于a的结束时间(b.start > a.end),显然如果大于就不会相交,而小于必然相交。等于是否表示相交需要看题目的规定。
给出了一个解决interval相关问题的模板:
public boolean genericIntervalTemplate(int[][] intervals) {
if (intervals.length == 0) //合法性检查,一般需要check intervals是否为空(*根据实