2019.5.30 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新)
观察什么时候可以合并区间,例如对于a=[1,3],b=[2,6]的情况下,当且仅当a[1]>b[0]且a[1]<b[1]的情况下可以进行合并(若a[1]>b[1],则会发生完全覆盖的情况,如a=[1,4],b=[2,3])
因此,只需要先对数组进行排序,再依次合并重叠区间即可。
Given a collection of intervals, merge all overlapping intervals.
给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
import java.util.*;
/**
* Given a collection of intervals, merge all overlapping intervals.
* 给出一个区间的集合,请合并所有重叠的区间。
*/
public class MergeIntervals {
public int[][] merge(int[][] intervals) {
if (intervals.length < 2 || intervals[0].length == 0) {
return intervals;
}
//按数组头元素升序排序(lambda表达式排序是真的慢)
//Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
Arrays.sort(intervals, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] - o2[0];
}
});
ArrayList<int[]> itvs = new ArrayList<>();
for (int i = 0; i < intervals.length - 1; i++) {
//寻找重叠区间
if (intervals[i][1] >= intervals[i + 1][0]) {
//排除完全重叠区间,如[1,4]与[2,3]
intervals[i + 1][0] = intervals[i][0];
intervals[i + 1][1] = intervals[i][1] > intervals[i + 1][1] ? intervals[i][1] : intervals[i + 1][1];
} else {
itvs.add(intervals[i]);
}
}
itvs.add(intervals[intervals.length - 1]);
return itvs.toArray(new int[0][]);
}
//输入输出不同版本
public class Interval {
int start;
int end;
Interval() {
start = 0;
end = 0;
}
Interval(int s, int e) {
start = s;
end = e;
}
}
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
Collections.sort(intervals, (a, b) -> a.start - b.start);
LinkedList<Interval> merged = new LinkedList<Interval>();
for (Interval interval : intervals) {
if (merged.isEmpty() || merged.getLast().end < interval.start) {
merged.add(interval);
}
else {
merged.getLast().end = Math.max(merged.getLast().end, interval.end);
}
}
ArrayList<Interval> result = new ArrayList<>();
result.addAll(merged);
return result;
}
}
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#