interval-合并MeetingRoom系列

关于intervals有很多很多故事可以讲。各个interval是否重叠,重叠几层,重叠的长度,是否排序过,是Offline的还是streaming的(本文都是offline的)……这里的几个是比较基本的,之后再补充。题目简介56. Merge Intervals基本操作:merge57. Insert Interval基本操作:insert252. Meeting Rooms判断是否重叠253. Meeting Rooms II求最多重叠几层1229
摘要由CSDN通过智能技术生成

关于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排好序了。于是分三步(从左往右撸):

  1. 先把和newInterval完全没接触的放进result
  2. merge有重叠的(一个或多个)
  3. 把之后和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[
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值