56. Merge Intervals

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

这道题跟Insert Intervals这道题很像,最开头要先对Intervals里面的Interval排序一下,用到了java的Collections.sort(List<Interval> list, Comparator<? super Interval> c)。 排序以Interval的start为第一标准,从小到大,如果start一样的情况下,才以end作为第二标准。这样排序的好处是,简化了接下来处理的难度。

我们只需要把intervals里的interval依次添加到结果集合里,每次将要添加时,只需要判断当前这个interval的start跟结果集合里面最后一个Interval的end谁大,如果结果集合里面最后一个Interval的end大,说明overlap了,需要改一下这个end就好了,否则没有Overlap,直接添加该Interval进结果集合里就好了。

sort的好处是,只用管end,不用管start, 因为新添加的Interval的start至少是大于等于结果集合里面已经添加的Interval的start的。换言之,start不受影响,简化了我们的处理。

所以本问题的关键在于给Intervals排序,可以用java的Collections.sort(List<Interval> list, Comparator<? super Interval> c)。因为Interval是我们自己定义的,所以我们也需要自己定义Comparator,而不能用默认的。我们可以写一个我们自己的Comparator来override默认的。规则是按起始点排序,然后如果起始点相同就按结束点排序。整个算法是先排序,然后再做一次线性遍历,时间复杂度是O(nlogn+n)=O(nlogn),空间复杂度是O(1),因为不需要额外空间,只有结果集的空间。

/**
 * 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 List<Interval> merge(List<Interval> intervals) {
        ArrayList<Interval> res = new ArrayList<Interval>();
        if (intervals == null || intervals.size() == 0) {
            return intervals;
        }
        Comparator<Interval> comp = new Comparator<Interval>() {
            public int compare(Interval t1, Interval t2) {
                if (t1.start == t2.start) {
                    return t1.end - t2.end;
                }
                return t1.start - t2.start;
            }
        };
        Collections.sort(intervals, comp);
        res.add(intervals.get(0));
        for (int i=1; i<intervals.size(); i++) {
            if (res.get(res.size()-1).end >= intervals.get(i).start) {
                res.get(res.size()-1).end = Math.max(res.get(res.size()-1).end, intervals.get(i).end);
            }
            else {
                res.add(intervals.get(i));
            }
        }
        return res;
    }
}

  

第一次做, 不能一股脑的用heap 啊

/**
 * 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 List<Interval> merge(List<Interval> intervals) {
        List<Interval> ans = new ArrayList<>();
        if (intervals == null || intervals.size() == 0) {
            return ans;
        }
        Comparator<Interval> comp = new Comparator<Interval>(){
            public int compare(Interval a, Interval b) {
                return a.start == b.start ? a.end - b.end : a.start - b.start;
            }
        };
        Comparator<Interval> cmp = new Comparator<Interval>(){
            public int compare(Interval a, Interval b) {
                return b.end - a.end;
            }
        };
        Collections.sort(intervals, comp);
        PriorityQueue<Interval> heap = new PriorityQueue<>(cmp);
        heap.add(intervals.get(0));
        for (int i = 1; i < intervals.size(); i++) {
            if (heap.peek().end >= intervals.get(i).start) {
                Interval cur = heap.poll();
                Interval merge = new  Interval(cur.start, Math.max(cur.end, intervals.get(i).end));
                heap.add(merge);
            } else {
                heap.add(intervals.get(i));
            }

        }
        while (!heap.isEmpty()) {
            ans.add(heap.poll());
        }
        return ans;
    }
}

  

时间: 2025-01-07 11:47:16

56. Merge Intervals的相关文章

LeetCode --- 56. Merge Intervals

题目链接:Merge Intervals Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 这道题的要求是将给定的一组间隔中有重叠的进行合并. 将间隔合并,首先要找到相邻的间隔,然后看其是否有重叠,如果有,就进行合并. 因此,首先考虑对数组排序.排序的时候,只需要按

No.56 Merge Intervals

No.56 Merge Intervals Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18]. 法一:直接复用之前写的insert函数,依次将区间段插入到结果集中 1 #include "stdafx.h" 2 #include <vector> 3

56. Merge Intervals - LeetCode

Question 56. Merge Intervals Solution 题目大意: 一个坐标轴,给你n个范围,把重叠的范围合并,返回合并后的坐标对 思路: 先排序,再遍历判断下一个开始是否在上一个范围内,如果在且结束坐标大于上一个坐标就合并 Java实现: public List<Interval> merge(List<Interval> intervals) { if (intervals == null || intervals.size() == 0) return i

LeetCode开心刷题四十二天——56. Merge Intervals

56. Merge Intervals Medium 2509194FavoriteShare Given a collection of intervals, merge all overlapping intervals. Example 1: 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, mer

[Leetcode][Python]56: Merge Intervals

# -*- coding: utf8 -*-'''__author__ = '[email protected]' 56: Merge Intervalshttps://oj.leetcode.com/problems/merge-intervals/ Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6]

56. Merge Intervals 57. Insert Interval *HARD*

1. Merge Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18]. /** * Definition for an interval. * struct Interval { * int start; * int end; * Interval() : start(0)

leetCode 56.Merge Intervals (合并区间) 解题思路和方法

Merge Intervals Given a collection of intervals, merge all overlapping intervals. For example, Given [1,3],[2,6],[8,10],[15,18], return [1,6],[8,10],[15,18]. 思路:题意很明确,首先对各区间按开始来排序,最后遍历,如果前面和后面的区间有重合,合并. 具体代码: /** * Definition for an interval. * publi

LeetCode 56. Merge Intervals (合并区间)

Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18]. 题目标签:Array 这道题目给了我们一个区间的list,让我们返回一个list,是合并了所有有重叠的区间之后的list.这道题目的关键在于如何判断两个区间有重叠,根据原题给的例子可以看出,在按照每个区间的start排序

[LeetCode] 56. Merge Intervals 解题思路

Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18]. 问题:给定一个区间集合,整合所有重叠的区间. 对区间集合按照 start 来排序,然后根据 intervals[i].start 和 res.lastElement.end 来整合即可. 1 int static com

[LeetCode] 56. Merge Intervals Java

题目: Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,10],[15,18],return [1,6],[8,10],[15,18]. 题意及分析:给出很多个区间,合并有重叠的区间,输出最后的结果.我们分析可以得知对于两个区间interval1和interval2,如果interval1.start<=interval2.start,有一下几种情