【LeetCode】区间合并

时间:2023-03-09 19:48:18
【LeetCode】区间合并

给定一组区间,将所有区间重叠的部分合并起来。

e.g.

给出 { [1, 3], [2, 6], [8, 10], [15, 18] },
返回 { [1, 6], [8, 10], [15, 18] }

区间使用结构体(C++)或类(Java)表示

struct Interval {
int start;
int end;
Interval() : start(), end() {}
Interval(int s, int e) : start(s), end(e) {}
};

原理很简单,按区间的第一个元素 start 递增的顺序排序所有区间,如果一个区间的 end 大于等于 后面一个区间的 start,说明两区间有重叠部分可以合并。

问题的难点就在于如何排序区间,C++ 11 和 Java 8 都引入了 lambda 函数(匿名函数)与 sort 结合来自定义排序方式。

C++实现:

 vector<Interval> merge(vector<Interval>& intervals) {
if (intervals.empty()) return {};
sort(intervals.begin(), intervals.end(), [](const Interval &a, const Interval &b){ return a.start < b.start; });
vector<Interval> result;
result.push_back(intervals[]);
for (int i = ; i < intervals.size(); i++) {
if (result.back().end < intervals[i].start) {
result.push_back(intervals[i]);
} else {
result.back().end = max(result.back().end, intervals[i].end);
}
}
return result;
}

Java实现:

 public List<Interval> merge(List<Interval> intervals) {
if (intervals.isEmpty()) return new LinkedList<Interval>();
intervals.sort((a, b) -> Integer.compare(a.start, b.start));
List<Interval> result = new LinkedList<Interval>();
result.add(intervals.get(0));
for (int i = 1; i < intervals.size(); i++) {
if (result.get(result.size() - 1).end < intervals.get(i).start) {
result.add(intervals.get(i));
} else {
result.get(result.size() - 1).end = Math.max(result.get(result.size() - 1).end, intervals.get(i).end);
}
}
return result;
}