贪心
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
class Solution {
public int[][] merge(int[][] intervals) {
/**
* 将区间按照起始坐标排序
*/
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
LinkedList<int[]> list = new LinkedList<>();
list.add(new int[]{intervals[0][0], intervals[0][1]});
/**
* 先将第一个区间放进列表,然后遍历原数组,和列表最后一个元素比较
* 如果重叠就删除最后一个元素,放入合并区间;否则就直接放入这个区间
*/
for (int i = 1; i < intervals.length; i++) {
int[] temp = list.getLast();
if (intervals[i][0] <= temp[1]){
list.removeLast();
list.add(new int[]{Math.min(temp[0], intervals[i][0]), Math.max(temp[1], intervals[i][1])});
}
else{
list.add(new int[]{intervals[i][0], intervals[i][1]});
}
}
return list.toArray(new int[list.size()][]);
}
}
/**
* 时间复杂度 O(nlogn)
* 空间复杂度 O(n)
*/
优化1——原地更新区间边界
import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;
class Solution {
public int[][] merge(int[][] intervals) {
/**
* 将区间按照起始坐标排序
*/
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
LinkedList<int[]> list = new LinkedList<>();
int left = intervals[0][0];
/**
* 记录每个答案的左边界,遍历原数组,如果下一个区间不重叠,就添加答案,更新下一个答案的左边界
* 如果重叠只更新区间的最大右边界,直到不重叠为止
*/
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] > intervals[i - 1][1]){
list.add(new int[]{left, intervals[i - 1][1]});
left = intervals[i][0];
}
else{
intervals[i][1] = Math.max(intervals[i][1], intervals[i - 1][1]);
}
}
/**
* 最后一个区间需要单独添加
*/
list.add(new int[]{left, intervals[intervals.length - 1][1]});
return list.toArray(new int[list.size()][]);
}
}
/**
* 时间复杂度 O(nlogn)
* 空间复杂度 O(n)
*/
https://leetcode-cn.com/problems/merge-intervals/