LeetCode刷题Medium篇Merge Intervals

题目

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, merge them into [1,6].

Example 2:

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

十分钟尝试

没有想到思路,看了看思路,其实感觉应该能想到,只是没有花太多时间去思考,来梳理一下思路,写代码。

1. 先按照start排序,根据start判断是否重叠

2. 首先,发生overlap的情况是,第二个interval的start小于第一个interval的end

3 如果第二个interval的start小于第一个interval的end,那么end取两个interval的最大值。如果不小于,无重叠,继续遍历

这个问题其实是两个指针的思路,不断移动两个指针。

/**
 * 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; }
 * }
 */
class Solution {
    //两个指针的思路
    public List<Interval> merge(List<Interval> intervals) {
        List<Interval> res=new ArrayList();
        if(intervals.size()==0) {
            return res;
        }
        //按照start排序
        intervals.sort((o1,o2)->Integer.compare(o1.start,o2.start));
        //取出第一个元素
        Interval firstInterval=intervals.get(0);
        int start=firstInterval.start;
        int end=firstInterval.end;
        for(int i=1;i<intervals.size();i++){
           Interval interval=intervals.get(i);
           if(interval.start<=end){
               //overlap重叠后修改边界,不用添加到res
               end=Math.max(end,interval.end);
           }
           else{
               //不重叠才会添加到res,添加上一个
               res.add(new Interval(start,end));
               start=interval.start;
               end=interval.end; 
           }
         
        }
        res.add(new Interval(start,end));
        return res;
    }
}

猜你喜欢

转载自blog.csdn.net/hanruikai/article/details/85712756