[LeetCode] 56. 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 considerred overlapping.
给定一个有重叠的区间集合,合并所有重叠的区间。先对区间以第一个元素进行排序,定义一个变量result记录合并后的区间。然后迭代这些区间,如果区间的开始值大于result的最后一个区间的结尾值,说明整个区间都在result的最后一个区间的右侧,直接添加到result。如果区间开始值小于result的最后一个区间的结尾值,则有重合需要合并,result中的最后一个区间的尾部值变为两个尾部中的最大值。
Java:
public class Solution { public List<Interval> merge(List<Interval> intervals) { if (intervals == null || intervals.size() <= 1) { return intervals; } Collections.sort(intervals, new IntervalComparator()); List<Interval> result = new ArrayList<Interval>(); Interval last = intervals.get(0); for (int i = 1; i < intervals.size(); i++) { Interval curt = intervals.get(i); if (curt.start <= last.end ){ last.end = Math.max(last.end, curt.end); }else{ result.add(last); last = curt; } } result.add(last); return result; } private class IntervalComparator implements Comparator<Interval> { public int compare(Interval a, Interval b) { return a.start - b.start; } } }
Java:
class Solution { /** * @param intervals, a collection of intervals * @return: A new sorted interval list. */ public List<Interval> merge(List<Interval> intervals) { List<Interval> ans = new ArrayList<>(); intervals.sort(Comparator.comparing(i -> i.start)); Interval last = null; for (Interval item : intervals) { if (last == null || last.end < item.start) { ans.add(item); last = item; } else { last.end = Math.max(last.end, item.end); } } return ans; } }
Python:
""" Definition of Interval. class Interval(object): def __init__(self, start, end): self.start = start self.end = end """ class Solution: # @param intervals, a list of Interval # @return a list of Interval def merge(self, intervals): intervals = sorted(intervals, key=lambda x: x.start) result = [] for interval in intervals: if len(result) == 0 or result[-1].end < interval.start: result.append(interval) else: result[-1].end = max(result[-1].end, interval.end) return result
C++:
class Solution { public: static bool comp(const Interval &a, const Interval &b) { return (a.start < b.start); } vector<Interval> merge(vector<Interval> &intervals) { vector<Interval> res; if (intervals.empty()) return res; sort(intervals.begin(), intervals.end(), comp); res.push_back(intervals[0]); for (int i = 1; i < intervals.size(); ++i) { if (res.back().end >= intervals[i].start) { res.back().end = max(res.back().end, intervals[i].end); } else { res.push_back(intervals[i]); } } return res; } };
类似题目:
[LeetCode] 57. Insert Interval 插入区间
All LeetCode Questions List 题目汇总