1、解题思路
- 排序区间 :首先将区间按照起点升序排列,这样便于后续的合并操作。
- 合并区间 :使用一个结果列表来存储合并后的区间。遍历排序后的区间列表,比较当前区间与结果列表中最后一个区间是否有重叠。如果有重叠,合并它们;如果没有重叠,直接将当前区间加入结果列表。
2、代码实现
C++
/**
* struct Interval {
* int start;
* int end;
* Interval(int s, int e) : start(start), end(e) {}
* };
*/
#include <vector>
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param intervals Interval类vector
* @return Interval类vector
*/
vector<Interval> merge(vector<Interval>& intervals) {
// write code here
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[0]);
for (int i = 1; i < intervals.size(); ++i) {
Interval& last = result.back();
if (intervals[i].start <= last.end) {
// 合并区间
last.end = max(last.end, intervals[i].end);
} else {
// 添加到结果列表
result.push_back(intervals[i]);
}
}
return result;
}
};
Java
import java.util.*;
/*
* public class Interval {
* int start;
* int end;
* public Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param intervals Interval类ArrayList
* @return Interval类ArrayList
*/
public ArrayList<Interval> merge (ArrayList<Interval> intervals) {
// write code here
if (intervals == null || intervals.size() == 0) {
return new ArrayList<Interval>();
}
// 按照区间起点升序排序
Collections.sort(intervals, new Comparator<Interval>() {
public int compare(Interval a, Interval b) {
return a.start - b.start;
}
});
ArrayList<Interval> result = new ArrayList<Interval>();
result.add(intervals.get(0));
for (int i = 1; i < intervals.size(); ++i) {
Interval last = result.get(result.size() - 1);
if (intervals.get(i).start <= last.end) {
// 合并区间
last.end = Math.max(last.end, intervals.get(i).end);
} else {
// 添加到结果列表
result.add(intervals.get(i));
}
}
return result;
}
}
Python
# class Interval:
# def __init__(self, a=0, b=0):
# self.start = a
# self.end = b
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param intervals Interval类一维数组
# @return Interval类一维数组
#
class Solution:
def merge(self , intervals: List[Interval]) -> List[Interval]:
# write code here
if not intervals:
return []
# 按照区间起点升序排序
intervals.sort(key=lambda x: x.start)
result = [intervals[0]]
for interval in intervals[1:]:
last = result[-1]
if interval.start <= last.end:
# 合并区间
last.end = max(last.end, interval.end)
else:
# 添加到结果列表
result.append(interval)
return result
3、复杂度分析
- 排序区间:首先将区间按照起点升序排序,这样便于后续的合并操作。
- 合并区间:使用一个结果列表来存储合并后的区间。遍历排序后的区间列表,比较当前区间与结果列表中最后一个区间是否有重叠。如果有重叠,合并它们;如果没有重叠,直接将当前区间加入结果列表。
- 时间复杂度:排序的时间复杂度为O(nlogn),合并的时间复杂度为O(n),因此总的时间复杂度为O(nlogn)。
- 空间复杂度:结果列表的空间复杂度为O(n),排序的空间复杂度为O(logn)(取决于排序算法),因此总的空间复杂度为O(n)。