题目描述(中等难度)
给定一个列表,将有重叠部分的合并。例如[ [ 1 3 ] [ 2 6 ] ] 合并成 [ 1 6 ] 。
解法一
参考这里的解法一。
排好序后我们只需要把新加入的节点和最后一个节点比较就够了。
情况 1,如果新加入的节点的左端点大于合并好的节点列表的最后一个节点的右端点,那么我们只需要把新节点直接加入就可以了。
情况 2 ,如果新加入的节点的左端点不大于合并好的节点列表的最后一个节点的右端点,那么只需要判断新加入的节点的右端点和最后一个节点的右端点哪个大,然后更新最后一个节点的右端点就可以了。
public class Merge_Intervals2 {
private static class Interval {
int start;
int end;
Interval(int[] interval) {
this.start = interval[0];
this.end = interval[1];
}
int[] toArray() {
return new int[]{this.start, this.end};
}
}
private static class IntervalComparator implements Comparator<Interval> {
public int compare(Interval a, Interval b) {
return Integer.compare(a.start, b.start);
}
}
public static int[][] merge(int[][] nums) {
List<Interval> intervalsList = new LinkedList<>();
for (int[] num : nums) {
intervalsList.add(new Interval(num));
}
intervalsList.sort(new IntervalComparator());
LinkedList<Interval> merged = new LinkedList<>();
for (Interval interval : intervalsList) {
if (merged.isEmpty() || merged.getLast().end < interval.start) {
merged.add(interval);
}
else {
merged.getLast().end = Math.max(merged.getLast().end, interval.end);
}
}
int i = 0;
int[][] result = new int[merged.size()][2];
for (Interval mergedInterval : merged) {
result[i] = mergedInterval.toArray();
i++;
}
return result;
}
public static void main(String args[]) {
int[][] nums = {{1,3},{2,6},{8,10},{15,18}} ;
int[][] ans=merge(nums);
for(int i=0;i<ans.length;i++) {
for(int j=0;j<ans[i].length;j++) {
System.out.println(ans[i][j]);
}
}
}
}
时间复杂度:O(n log(n)),排序算法。
空间复杂度:O(n),存储结果。另外排序算法也可能需要。