【leetcode】合併區間
阿新 • • 發佈:2018-12-19
合併區間
一、要求
給出一個區間的集合,請合併所有重疊的區間。
示例 1:
輸入: [[1,3],[2,6],[8,10],[15,18]] 輸出: [[1,6],[8,10],[15,18]] 解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合併為 [1,6].
示例 2:
輸入: [[1,4],[4,5]] 輸出: [[1,5]] 解釋: 區間 [1,4] 和 [4,5] 可被視為重疊區間。
二、思路
以【7,9】,【1,6】,【10,15】,【2,5】為例。
期望輸出【1,6】【7,15】
首先按照區間的左端點進行排序,形成【1,6】【2,5】,【7,9】,【8,15】
取第一個區間【1,6】,然後判斷該區間的右端點是否大於等於下一個區間的左端點,記為條件1,好,現在滿足,再取【1,6】【2,5】右端點的最大值為6,則不用修改【1,6】的區間。再次判斷【1,6】【7,9】,不滿足條件1,則將【1,6】加入到結果區間中。使得當前區間變為【7,9】,判斷【7,9】與【8,15】,滿足條件1,取右端點最大值為15,將【7,9】改為【7,15】,由於遍歷結束,將【7,15】加入到結果區間中。最後返回【1,6】【7,15】。
三、程式碼實現
class Interval { int start; int end; Interval() { start = 0; end = 0; } Interval(int s, int e) { start = s; end = e; } } public List<Interval> merge(List<Interval> intervals) { List<Interval> list = new ArrayList<>(); int len = intervals.size(); if (len == 0) { return list; } if (len == 1) { return intervals; } //按區間的左端點進行從小到大的排序 Collections.sort(intervals, new Comparator<Interval>() { @Override public int compare(Interval o1, Interval o2) { return o1.start - o2.start; } }); Interval temp = intervals.get(0); for (int i = 1; i < len; i++) { //此為條件1 if (temp.end >= intervals.get(i).start) { //取右端點最大值 temp.end = Math.max(temp.end, intervals.get(i).end); } else { //不滿足條件1,則加入到結果區間中,將當前比較區間變更為遍歷區間 list.add(temp); temp = intervals.get(i); } //遍歷到最後一個,判斷完直接加入到結果區間中 if (i == len - 1) { list.add(temp); } } return list; }