LeetCode刷題Medium篇Merge Intervals
阿新 • • 發佈:2019-01-09
題目
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; } }