1. 程式人生 > >【leetcode】合併區間

【leetcode】合併區間

                                                合併區間

一、要求

給出一個區間的集合,請合併所有重疊的區間。

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