[Java]leetcode56 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].

题意是:给定上面的区间范围,然后将区间上有交叉的部分进行融合。这一题需要注意的区间的开始可能不是递增的,也就是有可能[1,2],[4,6],[0,6]的情况。

之前也遇到过这样的题,想着用数组的方式去解题,感觉很复杂,没法下笔。后来看了一下Leetcode上是将每个区间作为一个对象来处理,思路瞬间开阔了很多。那对于每个区间的起始值不是递增情况,我们可以首先对它进行排列。然后再融合。那接下来的合并就有三种情况,

第一种是例如[0,4][1,3]的情况,前面的全部包含后面的。

第二种是例如[0,3][2,6],部分交叉。

第三种是例如[0,4][5,6]的情况,就是没有交叉。

而第一种和第二种又可以看成一种情况。

下面给出代码:

/**
 * 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) {
        int len=intervals.size();
        if(len<=1)return intervals;
        //对intervals进行排序
        Collections.sort(intervals,new IntervalsComparator());
        //取intervals中的第一个区间
        Interval newInterval=intervals.get(0);
        List<Interval> res=new ArrayList<Interval>();
        for(int i=1;i<len;i++)
        {
            Interval interval=intervals.get(i);
            //不相交的情况
            if(newInterval.end<interval.start)
            {
               res.add(newInterval);
               newInterval=interval;
            }else
            {
                //相交的情况
                newInterval=new Interval(newInterval.start,Math.max(newInterval.end,interval.end));
            }
        }
        res.add(newInterval);
        return res;
    }

    //自定义排序类,按照Interval的start变量进行升序排序
   class IntervalsComparator implements Comparator<Interval>
    {
        public int compare(Interval i1,Interval i2)
        {
           return i1.start-i2.start;
        }
    }
}

这题的关键点是定义了一个newInterval,首先进行排序,排除出现后面的区间与前面融合区间相交的情况,然后从前到后进行动态的融合。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-31 12:35:38

[Java]leetcode56 Merge Intervals的相关文章

[array] leetcode-56. Merge Intervals - Medium

leetcode-56. Merge Intervals - Medium descrition 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]. 解析 两个思路,都比较有难度.注意算法正确性的证明. 方法 1 - 连通分支 通过图的方法来解决.算法描述如下: 以每

LeetCode56 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]. (Hard) 分析: 前两天做google的笔试,中间有一道题用到关于区间merge的问题,就把leetcode上这两道区间合并题目先做一下. 思路就是先对每个区间的起始位置进行排序,然后维护一个left和rig

LeetCode第[56]题(Java):Merge Intervals

题目:合并区间 难度:Medium 题目内容: 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]] Example 2: Input: [[1,4],[4,5]] Output: [[1,5]] 我的思路:因为可能

2015.03.30 LeetCode Merge Intervals 解题记录

今天下午做了一道题.leetcode merge intervals 属于比较难的题目. 首先用collections.sort 给list排序,然后用两个while loop来比较两个interval 的start, end . 从而生成新的interal,再插入到新的list 返回结果. 下面给出自己的代码: /* 50 Merge Intervals https://leetcode.com/problems/merge-intervals/ Given a collection of i

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

题目链接: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]. 这道题的要求是将给定的一组间隔中有重叠的进行合并. 将间隔合并,首先要找到相邻的间隔,然后看其是否有重叠,如果有,就进行合并. 因此,首先考虑对数组排序.排序的时候,只需要按

【leetcode】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]. 先排序,然后循环合并 1 /** 2 * Definition for an interval. 3 * struct Interval { 4 * int start; 5 * int

60. Insert Interval &amp;&amp; Merge Intervals

Insert Interval Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). You may assume that the intervals were initially sorted according to their start times. Example 1: Given intervals [1,3],[6,9], i

【LeetCode】Merge Intervals 题解 利用Comparator进行排序

题目链接Merge Intervals /** * 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; } * } * 题目:LeetCode 第56题 Merge Intervals 区间合并给定一个区间的集合,将相邻区间之间