Hot100 - 合并区间

最佳思路:
先根据区间的左边界进行排序,然后采用类似贪心的方式进行合并。每次取出一个区间,与结果列表中的最后一个区间进行比较,如果能合并,则更新合并后的区间,否则直接将当前区间加入结果列表。
时间复杂度:
O(n log n),其中 n 为 intervals 数组的长度。排序是该算法的瓶颈。
代码:
class Solution {
public int[][] merge(int[][] intervals) {
List<int[]> ans = new ArrayList<>();
// 按照每个区间的左边界排序
Arrays.sort(intervals, (p, q) -> p[0] - q[0]);
for (int[] p : intervals) {
int m = ans.size();
// 如果当前区间与最后一个区间可以合并
if (m > 0 && ans.get(m - 1)[1] >= p[0]) {
ans.get(m - 1)[1] = Math.max(ans.get(m - 1)[1], p[1]); // 合并
} else {
ans.add(p); // 无法合并,直接添加
}
}
// 转换为二维数组返回
return ans.toArray(new int[ans.size()][]);
}
}
思路:
- 排序:首先将所有区间按左边界升序排序,确保我们按顺序处理区间。
- 遍历合并:遍历排序后的区间,检查当前区间能否与结果列表中的最后一个区间合并。如果可以合并,则更新最后一个区间的右边界;如果不能合并,则将当前区间添加到结果列表中。
- 转换并返回:最后将
List<int[]>
转换为二维数组int[][]
返回。