题目:
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
分析:
先排序,贪心算法,标记需要remove的位置
代码:
public List<Interval> merge(List<Interval> intervals) {
if (intervals.size() == 0)
return intervals;
// 排序
Collections.sort(intervals, new Comparator<Interval>() {
public int compare(Interval a, Interval b) {
return a.start - b.start;
}
});
List<Integer> list = new ArrayList<Integer>();
Interval x;
for (int i = 0; i < intervals.size();) {
x = intervals.get(i);
int j = i + 1;
while (j < intervals.size() && x.end >= intervals.get(j).start) {
x.end = Math.max(x.end, intervals.get(j).end);
list.add(j);
j++;
}
i = j;
}
int l = list.size();
for (int i = 0; i < l; i++) {
intervals.remove(list.get(i) - i);
}
return intervals;
}
效率:
总结:
自定义类的排序规则需要重写,很有用