题解 | #合并区间#

合并区间

https://www.nowcoder.com/practice/69f4e5b7ad284a478777cb2a17fb5e6a

import java.util.*;
/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
public class Solution {
    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        if (intervals.size() == 0) return intervals;
        
        //首先要做一件重要的事情,就是先把输入进来的空间,按照左端点排序
        //这里利用了匿名内部类的形式,重写了compare方法
        //之前我用的是Ayyays的sort方法重写,但是它接收的参数应该是数组类型,ArrayList应该用Collection的sort方法
        Collections.sort(intervals, new Comparator<Interval>() {
            @Override
            public int compare(Interval i1, Interval i2) {
                return Integer.compare(i1.start, i2.start);
            }
        });
        ArrayList<Interval> res = new ArrayList<>();
        res.add(intervals.get(0));
        for (int i = 1; i < intervals.size(); i++) {
            Interval interval = intervals.get(i);
            Interval preInterval = res.get(res.size() - 1);
            if (interval.start > preInterval.end ) {
                res.add(interval);
            } else if (interval.start <= preInterval.end) {
                //这里其实包含了两种情况,都是有重叠的,需要合并区间
                //可能是当前区间完全在之前的区间里面
                //也可能需要把之前的区间更改一下,增大区间范围
                preInterval.end = Math.max(preInterval.end, interval.end);
                res.set(res.size() - 1, preInterval);
            }

        }
        return res;


    }
}

首先一点很重要,就是直接对输入的区间,按照左端点进行排序。这里利用了匿名内部类进行定义排序。细节地方,如果区间为空,直接输出,这里我一开始没有注意,造成了程序报错,索引越界问题。在合并区间的时候,需要考虑是否有重叠部分,重叠部分也分为两种情况,一种是需要更改原区间,一种不做任何操作,可以把他们合并起来。

全部评论

相关推荐

11-02 09:49
已编辑
货拉拉_测试(实习员工)
热爱生活的仰泳鲈鱼求你们别卷了:没事楼主,有反转查看图片
点赞 评论 收藏
分享
勤奋努力的椰子这就开摆:美团骑手在美团工作没毛病
投递美团等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务