关于intervals有很多很多故事可以讲。各个interval是否重叠,重叠几层,重叠的长度,是否排序过,是Offline的还是streaming的(本文都是offline的)……
这里的几个是比较基本的,之后再补充。
题目 | 简介 |
---|---|
56. Merge Intervals | 基本操作:merge |
57. Insert Interval | 基本操作:insert |
252. Meeting Rooms | 判断是否重叠 |
253. Meeting Rooms II | 求最多重叠几层 |
1229. Meeting Scheduler | 求满足一定重叠长度的interval(2人) |
759. Employee Free Time | 求gap(多人) |
56. Merge Intervals
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
merge是要比较start,end的,所以直觉就是:不排序不行。
排好序,然后从左往右撸,维护一个“已经访问到的interval中的end time最晚的那个,lastInterval”,每次来个interval和这个lastInterval看是否重叠,重叠就merge,做成一个新的interval当成lastInterval;不重叠就把这个作为lastInterval。
另外有个细节,开始时把第一个interval填入result,然后撸的时候也从第一个开始撸就行。这样第一个interval会符合overlap的情况,就不往result里加了。
class Solution {
public int[][] merge(int[][] intervals) {
if (intervals.length <= 1) {
return intervals;}
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
List<int[]> result = new ArrayList<>();
result.add(intervals[0]);
int[] lastInterval = intervals[0];
for (int[] interval : intervals) {
if (interval[0] <= lastInterval[1]) {
//overlap
lastInterval[1] = Math.max(lastInterval[1], interval[1]);
} else {
lastInterval = interval;
result.add(interval);
}
}
return result.toArray(new int[result.size()][]);
}
}
57. Insert Interval
Input: intervals = [[1,3],[6,9]], newInterval = [2,5] 插入一个interval
Output: [[1,5],[6,9]]
这个题给的输入已经是按照start time排好序了。于是分三步(从左往右撸):
- 先把和newInterval完全没接触的放进result
- merge有重叠的(一个或多个)
- 把之后和newInterval完全没接触的放进result
在中间merge的部分2),有一点我第一次做错了,我用了两个变量start和end来记录merged部分的边界,想等最后merge结束之后,new一个新的interval。
//错误的code:
while (i < len && intervals[i][0] < newInterval[1]) {
start = Math.min(intervals[i][0], newInterval[0]);
end = Math.max(intervals[i][1], newInterval[1]);
i++;
}
result.add(new int[]{
start, end});
然而这样是不对的!因为每次比较都应该是和merged的interval的比较,而不是和第一个有重叠的interval一直比较。
为什么这个57.insert interval需要分三段,还需要用while-loop来merge,而56.merge interval同样是merge,56就很简单维护一个lastInterval就行呢?
区别在于:57除了插入的部分,其他部分即使有重叠,也不管(啥都不做);而56是整个数列统一处理,从头撸到尾,不需要什么while-loop的结束条件,直接for-loop从头到尾即可。
class Solution {
public int[][] insert(int[