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 considered overlapping.
让把重叠的interval合并,输出所有的interval
思路:
这种interval重叠的问题,首先就想到了按start point排序
然后重叠的话更新右端点,否则把区间加入输出
注意最后一个区间要在循环结束的时候加入输出
//36ms
public int[][] merge(int[][] intervals) {
if (intervals == null || intervals.length == 0) {
return new int[][]{};
}
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
ArrayList<int[]> arr = new ArrayList<>();
int left = intervals[0][0];
int right = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] <= right) {
right = Math.max(right, intervals[i][1]);
} else {
int[] tmp = new int[]{left, right};
arr.add(tmp);
left = intervals[i][0];
right = intervals[i][1];
}
}
arr.add(new int[]{left,right});
int[][] result = new int[arr.size()][2];
return arr.toArray(result);
}
或者以下版本,原理是一样的
//36ms
public int[][] merge(int[][] intervals) {
if (intervals == null || intervals.length == 0) {
return new int[][]{};
}
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
ArrayList<int[]> arr = new ArrayList<>();
for (int[] interval: intervals) {
if (arr.isEmpty() || interval[0] > arr.get(arr.size() - 1)[1]) {
arr.add(interval);
} else {
arr.get(arr.size() - 1)[1] = Math.max(arr.get(arr.size() - 1)[1], interval[1]);
}
}
int[][] result = new int[arr.size()][2];
return arr.toArray(result);
}
public int[][] merge(int[][] intervals) {
if(intervals == null || intervals.length == 0) {
return new int[][]{};
}
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
List<int[]> tmp = new ArrayList<>();
int left = intervals[0][0];
int right = intervals[0][1];
tmp.add(new int[]{left, right});
for(int i = 1; i < intervals.length; i++) {
if(intervals[i][0] > tmp.get(tmp.size() - 1)[1]) {
tmp.add(new int[]{intervals[i][0], intervals[i][1]});
} else {
left = tmp.get(tmp.size() - 1)[0];
right = Math.max(intervals[i][1], tmp.get(tmp.size() - 1)[1]);
tmp.set(tmp.size()-1, new int[]{left, right});
}
}
int[][] result = new int[tmp.size()][2];
result = tmp.toArray(result);
return result;
}