1. 程式人生 > >LeetCode刷題Medium篇Merge Intervals

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;
    }
}