056 Merge Intervals

Given a collection of intervals, merge all overlapping intervals.

tips:这题是北航2017年推免生的机试题

Example:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considerred overlapping.

解释下题目:

给定一些区间,然后求出这些区间的最大区间。

1. 先按照起始位置排序,然后求解

实际耗时:15ms

public List<Interval> merge(List<Interval> intervals) {
        //因为之后有intervals.get(0).start,所以需要排除Null
        if (intervals.isEmpty()) {
            return intervals;
        }
        //先按start从小到大排
        Collections.sort(intervals, new IntervalComparator());
        List<Interval> result = new ArrayList<>();
        //result_start记录最大的区间的起始位置,result_end记录最大的区间末尾位置
        int result_start = intervals.get(0).start;
        int result_end = intervals.get(0).end;
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals.get(i - 1).start == intervals.get(i).start) {
                //找到相同的start中end最大的,就是整个区间最长的
                result_end = Math.max(intervals.get(i).end, result_end);
                continue;
            } else {
                //此时两个区间完全没有交集
                if (intervals.get(i).start > result_end) {
                    //把前一个放进去
                    result.add(new Interval(result_start, result_end));
                    //把这两个值赋予初值,开始下一轮循环
                    result_start = intervals.get(i).start;
                    result_end = intervals.get(i).end;
                } else {
                    //说明这两个的区间是有交集的
                    result_end = Math.max(intervals.get(i).end, result_end);
                }
            }
        }
        //记得把最后的一个区间放进去
        result.add(new Interval(result_start, result_end));
        return result;
    }

    //搞个比较器类,start小的排前面
    private class IntervalComparator implements Comparator<Interval> {
        @Override
        public int compare(Interval o1, Interval o2) {
            if (o1.start < o2.start) {
                return -1;
            } else if (o1.start > o2.start) {
                return 1;
            } else return 0;


            //return a.start < b.start ? -1 : a.start == b.start ? 0 : 1;
        }
    }
踩过的坑:什么都没有的list,还有比较器不可太复杂,否则好像不让过

  思路,首先按照start从小到大开始排序,这样之后如果之后如果有相同的start的,那么它们肯定是相邻的,只需要找出这些相同start的区间的最大的end即可。如果发现有个区间的start和之前的不同,那么只需要判断这个区间的start是否落入之前的区间,如果落入那么就扩展最大区间,如果没有落入说明之前的那个就是最大区间。最后不要忘了把最后一个区间加进去。

时间复杂度O(nlogn)
空间复杂度O(1)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,323评论 19 139
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,349评论 0 33
  • 1.如图所示,直接创建一个widget,一直下一步即可 创建好后 会生成响应的布局xml文件 xml文件下会生成一...
    daixa阅读 11,576评论 3 3
  • 乔斯是一个落魄画家,他经历了他人生最暗淡的一段时间,那时乔斯吃饭也成了问题。 他可以去街头卖他的画来增加收入,但他...
    沈拾阅读 1,332评论 0 0
  • 先看示例 首先搭建好基础界面 然后我们就要在AlertViewController里面做事情了 ps:大部分是布局...
    比沉默寡言话多阅读 11,803评论 2 13