56、合併區間 (Merge Intervals)

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

示例 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] 可被視爲重疊區間。
解題思路:
*  根據對象的start 升序排序
*  遍歷對象列表
*  如果當前結果列表最後一個元素end比下一個元素的start小   則把下一個加入到結果列表
*  否則 將當前結果列表中最後一個元素的end賦值 = max(res.get(last()).end, current.end)

java

public class Solution {

    public class Interval {
          int start;
          int end;
          Interval() { start = 0; end = 0; }
          Interval(int s, int e) { start = s; end = e; }
     }


    /**
     * 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; }
     * }
     */
    public List<Interval> merge(List<Interval> intervals) {

        // 根據start排序
        Collections.sort(intervals, (x,y) -> (x.start - y.start));
        LinkedList<Interval> res = new LinkedList<>();
        for (Interval inerval: intervals
             ) {
            if (res.isEmpty() || res.peekLast().end < inerval.start) {
                res.addLast(inerval);
            } else {
                res.peekLast().end = Math.max(inerval.end, res.peekLast().end );
            }
        }
        return res;
    }


}

python

# Definition for an interval.
class Interval:
    def __init__(self, s=0, e=0):
        self.start = s
        self.end = e


class Solution:
    def merge(self, intervals):
        """
        :type intervals: List[Interval]
        :rtype: List[Interval]
        """
        intervals.sort(key=lambda x : x.start)
        res = []
        for interval in intervals:
            if len(res) <= 0 or res[len(res)-1].end < interval.start:
                res.append(interval)
            else:
                res[len(res)-1].end  = max(res[len(res)-1].end, interval.end)
        return res

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章